Пакет Laravel 5 предназначенный для работы с формами.
Требует и автоматически устанавливает пакет https://github.com/arturishe21/mail_templates_l5 для работы с отправкой писем.
Поддерживает интеграцию с Google Invisible reCaptcha., (*1)
Разделы
1. Установка
2. VIS-CMS
3. Настройка
4. Пример использования
5. Описание классов, (*2)
Установка
Выполняем, (*3)
composer require "vis/apply_form_l5":"1.*"
Добавляем ApplyFormServiceProvider в массив ServiceProviders в config/app.php, (*4)
Vis\ApplyForm\ApplyFormServiceProvider::class,
Выполняем миграцию таблиц, (*5)
php artisan migrate --path=vendor/vis/apply_form_l5/src/Migrations
Публикуем js, nodes, (*6)
php artisan vendor:publish --provider="Vis\ApplyForm\ApplyFormServiceProvider" --force
Добавляем в layouts.default(или на конкретную вьюху, если заявка только на одной странице) перед закрывающим тегом body, (*7)
@include('apply_form::apply_form')
VIS-CMS
В \config\builder\admin.php дописываем массив, (*8)
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 и добавляем их к группам., (*9)
'Заявки' => 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 , (*10)
Включаем капчу и добавляем публичный и скрытый ключи, (*11)
/**
* 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 запроса, (*12)
ApplyForm.successCallback = function (message) {
};
ApplyForm.failCallback = function (message) {
};
В этом же файле можно дописать дополнительные правила проверки полей, например добавить маску для телефонов.
Для этого в класс ApplyFormRules нужно добавить свой метод, например:, (*13)
initPhoneMask: function () {
$('input[name=phone]').mask('+38 (000) 000-00-00', {clearIfNotMatch: true});
},
И зарегистрировать его инициализацую в методе ApplyFormRules.init(), (*14)
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
{
}
Описание обязательных свойств:, (*15)
Имя используемой таблицы
Значение: строка', (*16)
protected $table = '';
Описание дополнительных свойств:, (*17)
Правила валидации
Значение: массив, (*18)
protected $validationRules = [
];
Название поля с файлом
Используется, если форма передает файл
Значение: строка, (*19)
protected $fileFieldName = '';
Путь к папке, в которой будет хранится файл относительно публичной директории
Используется, если форма передает файл
Значение: строка, (*20)
protected $fileStorageFolder = '';
Путь к папке, в которой будет хранится файл относительно публичной директории
Используется, если форма передает файл
Значение: строка, (*21)
protected $fileStorageFolder = '';
Название шаблона письма
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug шаблона класса Vis\MailTemplates\MailT, (*22)
protected $mailTemplate = '';
Список имейлов для отправки письма
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug записи класса Vis\ApplyForm\Models\ApplyFormSettingEmail, (*23)
protected $mailAddressSlug = '';
Возвращаемое сообщение после удачного сохранения заявки
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug записи класса Vis\ApplyForm\Models\ApplyFormSettingMessage, (*24)
protected $messageSlug = '';
Возвращаемое сообщение после неудачного сохранения заявки
Используется, если после сохранения нужно отправить письмо на почту
Значение: строка с slug записи класса Vis\ApplyForm\Models\ApplyFormSettingMessage, (*25)
protected $messageFailSlug = '';
Описание обязательных методов:, (*26)
Метод подготовки исходных данных
Рекомендуется использовать класс-помошник Vis\ApplyForm\Helpers\InputCleaner для очистки данных
Значение: массив
Возвращаемое значение: массив, (*27)
protected function prepareInputData(array $inputData): array
Описание дополнительных свойств:, (*28)
Метод преобразования подготовленных данных в данные для отправки на почту
Значение: массив
Возвращаемое значение: массив, (*29)
protected function prepareMailData(array $preparedData): array
Метод вызова дополнительного функционала вызываемый после сохранения заявки, например передача данных в API
Значение: массив, (*30)
protected function customCallback($attributes)
```
2. Класс Vis\ApplyForm\Helpers\InputCleaner
**Описание методов:**
Метод установки массива исходных данных</br>
Значение: массив</br>
```php
public function setArray(array $array)
Метод получения массива данных
Значение: массив, (*31)
public function getArray(): array
Метод получения значения по названию поля из массива данных
Значение: строка
Возвращаемое значение: значение из массива или null, (*32)
public function get(string $field)
Метод получения целочисленного значения по названию поля из массива данных
Значение: строка
Возвращаемое значение: целое число, (*33)
public function getInt(string $field): int
Метод получения дробногочисленного значения по названию поля из массива данных
Значение: строка
Возвращаемое значение: дробное число, (*34)
public function getFloat(string $field): float
Метод получения строчного значения по названию поля из массива данных
Значение: строка
Возвращаемое значение: дробное число, (*35)
public function getString(string $field): string
Метод получения очищенного строчного значения по названию поля из массива данных
Значение: строка
Возвращаемое значение: дробное число, (*36)
public function getCleanString(string $field): string
Метод получения json строки по названию поля из массива данных
Значение: строка
Возвращаемое значение: строка json, (*37)
public function getJson(string $field): string
- Класс Vis\ApplyForm\Helpers\TableHandler
Класс хендлер для tb-definitions.
Метод превращения строки с ссылкой на файл в ссылку на файл, (*38)
protected function handleFile($formField, array &$row)
Метод превращения строки типа foreign в ссылку на foreign объект
Примечание: в дефинишен поля foreign надо дописать параметр 'foreign_model', а в указанной модели определить метод getAdminUrl, (*39)
protected function handleForeign($formField, array &$row)