vis/apply_form_l5

L5的应用表单处理器包

1.0.9 2018-01-24 18:21 UTC

This package is not auto-updated.

Last update: 2024-09-15 04:05:32 UTC


README

这是一个针对Laravel 5的包,用于处理表单。需要并自动安装https://github.com/arturishe21/mail_templates_l5包来处理邮件发送。支持与Google Invisible reCaptcha的集成。

部分

  1. 安装
  2. VIS-CMS
  3. 配置
  4. 使用示例
  5. 类描述

安装

执行

    composer require "vis/apply_form_l5":"1.*"

将 ApplyFormServiceProvider 添加到 config/app.php 中的 ServiceProviders 数组中

   Vis\ApplyForm\ApplyFormServiceProvider::class,

执行表迁移

   php artisan migrate --path=vendor/vis/apply_form_l5/src/Migrations

发布js, nodes

    php artisan vendor:publish --provider="Vis\ApplyForm\ApplyFormServiceProvider" --force

在 layouts.default(或特定视图,如果申请仅在单个页面上)的 body 关闭标签前添加

@include('apply_form::apply_form')

VIS-CMS

在 \config\builder\admin.php 中添加数组

    array(
        'title' => 'Заявки',
        'icon'  => 'list',
        'check' => function() {
            return Sentinel::hasAccess('admin.apply_form.view');
        },
        'submenu' => array(
            array(
                'title' => "Отправленные заявки",
                'check' => function() {
                    return Sentinel::hasAccess('admin.apply_form.view');
                },
                'submenu' => array(
                    //определение tb-definitions для форм заявок
                )
            ),
            array(
                'title' => "Сообщения ответы",
                'link'  => '/vis_apply_form_setting_messages',
                'check' => function() {
                    return Sentinel::hasAccess('admin.vis_apply_form_setting_messages.view');
                }
            ),
            array(
                'title' => "E-mail адреса",
                'link'  => '/vis_apply_form_setting_emails',
                'check' => function() {
                    return Sentinel::hasAccess('admin.vis_apply_form_setting_emails.view');
                }
            ),
        )
    ),

在 config/builder/tb-definitions/groups.php 中添加权限,并将其添加到组中

    'Заявки' => array(
        'admin.apply_form.view'   => 'Просмотр',
        'admin.apply_form.create' => 'Создание',
        'admin.apply_form.update' => 'Редактирование',
        'admin.apply_form.delete' => 'Удаление',
    ),
    'Заявки - Сообщения' => array(
        'admin.vis_apply_form_setting_messages.view'   => 'Просмотр',
        'admin.vis_apply_form_setting_messages.create' => 'Создание',
        'admin.vis_apply_form_setting_messages.update' => 'Редактирование',
        'admin.vis_apply_form_setting_messages.delete' => 'Удаление',
    ),
    'Заявки - Имейлы' => array(
        'admin.vis_apply_form_setting_emails.view'   => 'Просмотр',
        'admin.vis_apply_form_setting_emails.create' => 'Создание',
        'admin.vis_apply_form_setting_emails.update' => 'Редактирование',
        'admin.vis_apply_form_setting_emails.delete' => 'Удаление',
    ),

配置

在文件 config/apply_form/apply_form.php 中

启用验证码并添加公共和私有密钥

    /**
     * Defines usage of Google Invisible reCaptcha
     * @link https://www.google.com/recaptcha/admin
     */
    'grecaptcha' => [
        'enabled'    => true,
        'site_key'   => '',
        'secret_key' => ''
    ],

在文件 public/js/apply_form_rules.js 中重定义方法和指定它们在ajax请求完成时的操作(例如,调用带有自定义消息的弹出窗口)

ApplyForm.successCallback = function (message) {
};

ApplyForm.failCallback = function (message) {
};

在此文件中还可以添加额外的字段验证规则,例如为电话添加掩码。
为此,在 ApplyFormRules 类中添加自己的方法,例如

        initPhoneMask: function () {
            $('input[name=phone]').mask('+38 (000) 000-00-00', {clearIfNotMatch: true});
        },

并在 ApplyFormRules.init() 方法中注册初始化

        init: function () {
            ApplyFormRules.initPhoneMask();
        },

使用示例

  1. 定义一个扩展 Vis\ApplyForm\Models\AbstractApplyForm 类的类
namespace App\Models\ApplyForm;

use Vis\ApplyForm\Models\AbstractApplyForm;

class ApplyFormAuthorizedMessage extends AbstractApplyForm
{
	protected $table = "apply_form_authorized_messages";

	protected $validationRules = [
        "personal_data" => 'required|integer|in:1',
        'name'          => 'alpha|min:4|max:64',
        'answer_type'   => 'required|in:phone,email',
        'phone'         => 'nullable|required_if:answer_type,phone|size:19|regex:/\+38 \((\d{3})\) \d{3}-\d{2}-\d{2}/',
        'email'         => 'nullable|required_if:answer_type,email|email|min:4|max:64',
        'message'       => 'required|min:10|max:2000',
        'file'       => 'required|max:3072|mimes:pdf,doc,docx'
    ];

    protected $fileFieldName = 'file';
    protected $fileStorageFolder = 'storage/apply_forms/files/authorized_message/';
    
    protected $mailTemplate    = 'shablon-zajavka-avtorizirovannoe-obrashenie';
    protected $mailAddressSlug = 'email-zayavka-avtorizirovannoe-obrashenie';
    protected $messageSlug     = 'soobshchenie-zayavka-avtorizirovannoe-obrashenie';
    protected $messageFailSlug = 'soobshchenie-fail-zayavka-avtorizirovannoe-obrashenie';

    protected function prepareInputData(array $inputData): array
    {
        $this->inputCleaner()->setArray($inputData);

        $preparedData = [
            'name'        => $this->inputCleaner()->getCleanString('name'),
            'answer_type' => $this->inputCleaner()->getString('answer_type'),
            'phone'       => $this->inputCleaner()->getString('phone'),
            'email'       => $this->inputCleaner()->getCleanString('email'),
            'message'     => $this->inputCleaner()->getCleanString('message'),
            'file'        => $this->inputCleaner()->getString('file'),
        ];

        return $preparedData;
    }

    protected function prepareMailData(array $preparedData): array
    {
        $preparedData['answer_type'] = $preparedData['answer_type'] == 'email' ? 'Email' : 'Телефон';
        $preparedData['file_url']    =  asset($preparedData['file']);


        return $preparedData;
    }
        
    protected function customCallback(array $attributes)
    {
        //print_arr($attributes);
    } 
}
  1. 将其添加到 config/apply_form/apply_form.php 中的 apply_forms 数组中
    'apply_forms' => [
        'authorized_messages' => App\Models\ApplyForm\ApplyFormAuthorizedMessage::class,
    ],
  1. 在模板中创建一个名为 'название_формы_form' 的表单,例如
<form id="authorized_message_form">
    <div class="form-field">
        <select name="answer_type">
            <option value="email">{{__t('Отримати відповідь на e-mail')}}</option>
            <option value="phone">{{__t('Отримати відповідь телефоном')}}</option>
        </select>
    </div>
    <div class="form-field">
        <input type="text" name='name' placeholder="{{__t('ПІБ')}}">
        <p>{{__t("обов`язкове поле")}}</p>
    </div>
    <div class="form-field">
        <input type="text" name='email' placeholder="E-mail" class="answer-type">
        <p>{{__t("обов`язкове поле")}}</p>
    </div>
    <div class="form-field">
        <input type="text" name='phone' placeholder="{{__t('Номер телефону')}}" class="answer-type">
        <p>{{__t("обов`язкове поле")}}</p>
    </div>
    <div class="form-field">
        <textarea name='message' placeholder="{{__t('Повідомлення')}}" ></textarea>
        <p>{{__t("обов`язкове поле")}}</p>
    </div>
        <div class="form-field">
            <div class="attach-file">
                <div class="upload-file">
                    <input type="file" class="file-input" placeholder="file" id="file" name="file" accept="application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/pdf">
                    <div class="file_upload">
                        <div class="file_name_placeholder">{{__t('файл')}} (DOC, DOCX, PDF)</div>
                        <div class="file_name">{{__t('файл')}} (DOC, DOCX, PDF)</div>
                        <button class="btn btn_delete">{{__t('Видалити')}}</button>
                        <button class="btn btn_upload">{{__t('Завантажити')}}</button>
                    </div>
                    <div class="hint">{{__t('Дозволено приєднувати тільки')}}: DOC, DOCX, PDF (3 MB {{__t('максимум')}})</div>
                </div>
            </div>
        </div>
    <div class="form-field">
        <input type="checkbox" name="personal_data" id="authorized_message-personal_data-checkbox" class="checkbox" value="1">
        <label for="authorized_message-personal_data-checkbox" class="css-label">
            {{__t("Я згоден на збір та обробку моїх персональних даних, відповідно до")}} <a href="javascript:;">{{__t('Закону України “Про захист персональних даних”')}}</a>
        </label>
    </div>
    <div class="form-button">
        <button type="submit" class="btn">{{__t('Відправити')}}</button>
    </div>
</form>
  1. 在文件 public/js/apply_form_rules.js 中添加jquery validation规则
    规则定义为 'название_формы_rules' 和 'название_формы_messages'
ApplyForm.authorized_message_rules = {
    'personal_data' : { required: true },
    'answer_type'   : { required: true, responseMethod: true  },
    'name'          : { required: true, rangelength: [4,64]},
    'phone'         : { rangelength: [19, 19]},
    'email'         : { rangelength: [4, 64], email: true },
    'message'       : { required: true, rangelength: [10, 2000]},
};

ApplyForm.authorized_message_messages = {
    'personal_data' : { required: ''},
    'answer_type'   : { required: '', responseMethod: '',},
    'name'          : { required: '', rangelength: '' },
    'phone'         : { rangelength: '' },
    'email'         : { rangelength: '', email: '' },
    'message'       : { required: '', rangelength: ''},
};

ApplyForm.successCallback = function (message) {
    Popup.showWithMessage('popup-success', message);
};

ApplyForm.failCallback = function (message) {
    Popup.showWithMessage('popup-error', message);
};

//add additional methods for validating inputs
var ApplyFormRules =
    {
        initPhoneMask: function () {
            $('input[name=phone]').mask('+38 (000) 000-00-00', {clearIfNotMatch: true});
        },

        init: function () {
            ApplyFormRules.initPhoneMask();
        },
    }

类描述

  1. 扩展 Vis\ApplyForm\Models\AbstractApplyForm 类
namespace App\Models\ApplyForm;

use Vis\ApplyForm\Models\AbstractApplyForm;

class ApplyFormAuthorizedMessage extends AbstractApplyForm
{

}

必填属性描述

使用的表名
值:字符串

	protected $table = '';

其他属性描述

验证规则
值:数组

	protected $validationRules = [
    ];

具有文件的字段名称
如果表单传输文件则使用
值:字符串

    protected $fileFieldName = '';

相对于公共目录的存储文件的文件夹路径
如果表单传输文件则使用
值:字符串

    protected $fileStorageFolder = '';

相对于公共目录的存储文件的文件夹路径
如果表单传输文件则使用
值:字符串

    protected $fileStorageFolder = '';

邮件模板名称
如果保存后需要发送邮件则使用
值:具有 Vis\MailTemplates\MailT 类的 slug 的字符串

    protected $mailTemplate    = '';

发送邮件的电子邮件列表
如果保存后需要发送邮件则使用
值:具有 Vis\ApplyForm\Models\ApplyFormSettingEmail 类的 slug 的字符串

    protected $mailAddressSlug = '';

保存申请后返回的消息
如果保存后需要发送邮件则使用
值:具有 Vis\ApplyForm\Models\ApplyFormSettingMessage 类的 slug 的字符串

    protected $messageSlug = '';

保存申请失败后返回的消息
如果保存后需要发送邮件则使用
值:具有 Vis\ApplyForm\Models\ApplyFormSettingMessage 类的 slug 的字符串

    protected $messageFailSlug = '';

必填方法描述

数据准备方法
建议使用 Vis\ApplyForm\Helpers\InputCleaner 类来清理数据 值:数组
返回值:数组

    protected function prepareInputData(array $inputData): array

其他属性描述

将准备好的数据转换为邮件发送数据的转换方法
值:数组
返回值:数组

    protected function prepareMailData(array $preparedData): array

在保存申请后调用的额外功能,例如将数据传输到API
值:数组

    protected function customCallback($attributes)
  1. 类 Vis\ApplyForm\Helpers\InputCleaner

方法描述

设置原始数据数组的方法
值:数组

    public function setArray(array $array)

获取数据数组的方法
值:数组

    public function getArray(): array

从数据数组中按名称获取值的方法
值:字符串
返回值:数组中的值或null

    public function get(string $field)

从数据数组中按名称获取整数值的方法
值:字符串
返回值:整数

    public function getInt(string $field): int

从数据数组中按名称获取浮点值的方法
值:字符串
返回值:浮点数

    public function getFloat(string $field): float

根据字段名称从数据数组获取行值的方法
值:字符串
返回值:浮点数

    public function getString(string $field): string

根据字段名称从数据数组获取清洗后的行值的方法
值:字符串
返回值:浮点数

    public function getCleanString(string $field): string

根据字段名称从数据数组获取JSON字符串的方法
值:字符串
返回值:JSON字符串

    public function getJson(string $field): string
  1. 类 Vis\ApplyForm\Helpers\TableHandler - 用于tb-definitions的处理类。

将包含文件链接的字符串转换为文件链接的方法

    protected function handleFile($formField, array &$row)

将外键类型字符串转换为外键对象链接的方法
注意:在foreign字段的定义中需要添加参数'foreign_model',并在指定的模型中定义getAdminUrl方法。

    protected function handleForeign($formField, array &$row)