vis / apply_form_l5
Apply Forms handler package for L5
Requires
README
Пакет Laravel 5 предназначенный для работы с формами. Требует и автоматически устанавливает пакет https://github.com/arturishe21/mail_templates_l5 для работы с отправкой писем. Поддерживает интеграцию с Google Invisible reCaptcha.
Разделы
Установка
Выполняем
composer require "vis/apply_form_l5":"1.*"
Добавляем ApplyFormServiceProvider в массив ServiceProviders в config/app.php
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); } }
- Добавляем его в массив форм apply_forms в config/apply_form/apply_form.php
'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 = '';
Название шаблона письма
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug шаблона класса Vis\MailTemplates\MailT
protected $mailTemplate = '';
Список имейлов для отправки письма
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug записи класса Vis\ApplyForm\Models\ApplyFormSettingEmail
protected $mailAddressSlug = '';
Возвращаемое сообщение после удачного сохранения заявки
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug записи класса Vis\ApplyForm\Models\ApplyFormSettingMessage
protected $messageSlug = '';
Возвращаемое сообщение после неудачного сохранения заявки
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug записи класса Vis\ApplyForm\Models\ApplyFormSettingMessage
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 объект
Примечание: в дефинишен поля foreign надо дописать параметр 'foreign_model', а в указанной модели определить метод getAdminUrl
protected function handleForeign($formField, array &$row)