vis / apply_form_l5
L5的应用表单处理器包
Requires
README
这是一个针对Laravel 5的包,用于处理表单。需要并自动安装https://github.com/arturishe21/mail_templates_l5包来处理邮件发送。支持与Google Invisible reCaptcha的集成。
部分
安装
执行
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(); },
使用示例
- 定义一个扩展 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); } }
- 将其添加到 config/apply_form/apply_form.php 中的 apply_forms 数组中
'apply_forms' => [ 'authorized_messages' => App\Models\ApplyForm\ApplyFormAuthorizedMessage::class, ],
- 在模板中创建一个名为 'название_формы_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>
- 在文件 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(); }, }
类描述
- 扩展 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)
- 类 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
- 类 Vis\ApplyForm\Helpers\TableHandler - 用于tb-definitions的处理类。
将包含文件链接的字符串转换为文件链接的方法
protected function handleFile($formField, array &$row)
将外键类型字符串转换为外键对象链接的方法
注意:在foreign字段的定义中需要添加参数'foreign_model',并在指定的模型中定义getAdminUrl方法。
protected function handleForeign($formField, array &$row)