Валидация полей формы
При создании форм используются поля, описанные в разделе Типы данных. Независимо от способа создания формы (из модели / без модели) поля имеют свойства, которые заданы по умолчанию.
- для всех типов полей: required, must_match
- char: regexp, captcha, length, min_length, max_length, min_max_length, unique
- int, float: zero_allowed, positive
- email, phone, url, redirect: format, а также свойства, наследуемые от char
- text: свойства, наследуемые от char
- file, image, multi_images: allowed_extensions, allowed_mime_types, в виде массива
На основании этих свойств происходит изначальная валидация полей форм методом validate().
//Задаем поля будущей формы
$fields = [
['Имя', 'char', 'name', ['max_length' => 20]],
['Код купона', 'char', 'cupon', ['length' => 8]],
['О себе', 'text', 'about'],
['Email', 'email', 'email', ['unique' => true]],
['Пароль', 'password', 'password', ['min_length' => 5]],
['Повтор пароля', 'password', 'password_repeat', ['must_match' => 'password']],
['Captcha', 'char', 'code', ['captcha' => 'extra/captcha-simple']]
];
//Создаем объект формы
$form = new Form($fields);
//Задаем обязательные поля
$form -> setRequiredFields(['name', 'password', 'password_repeat', 'code']);
//Добавляем еще одно поле
$form -> addField(['Фотография', 'image', 'photo', ['files_folder' => 'uploads']));
//Получаем данные из POST и валидируем
$form -> submit() -> validate();
//Можем проверить состояние формы (чаще в AJAX)
Debug::pre($form -> getState());
//Если форма валидна
if($form -> isSubmitted() && $form -> isValid())
{
...
}
//Выборочная валидация полей
$form -> submit() -> validate(['name', 'coupon']);
//Добавление ошибки в форму
$form -> addError('Пожалуйста введите более подробное описание деятельности.');
//Ручная установка значения поля
$form -> about = 'Описание деятельности не указано.';
Таким образом при проверке полей будут задействованы правила max_length, length, required, min_length, must_match для соответствующих полей. Исходя из конкретной ситуации, можно переопределить заданные правила для полей или назначить новые.
Добавление нового правила
Для добавления нового правили нужно вызвать метод addRule() с массивом параметров в следующем порядке:
- название поля, также может быть массивом или символом '*' для всех полей
- название свойства, характерное для типа данных, к которому относится данное поле
- значение свойства для проверки (если передать значение в виде '->', то будет изменено только сообщение а правило останется в прежнем виде, это удобно для изменения сообщения об ошибках для полей, проверяемых регулярными выражениями: int, float, email, phone, url, redirect
- сообщение, которое выводится если проверка не пройдена, если данный параметр не передан, будет выводиться системное сообщение для данного правила
//Делаем поле обязательным для заполнения
$form -> addRule('cupon', 'required', true, 'Для регистрации необходимо ввести код купона.');
//Делаем все поля обязательными для заполнения
$form -> addRule('*', 'required', true, 'Данное поле должно быть заполнено.');
//Добавляем проверку по регулярному выражению
$form -> addRule('cupon', 'regexp', '/^d+$/', 'Код купона может содержать только цифры.');
//Задаем минимальную длину для вводимого текста
$form -> addRule('about', 'min_length', 200, 'Для рассказа о себе необходимо не менее 200 символов.');
//Задаем максимальную длину для нескольких полей
$form -> addRule(['name', 'cupon', 'email'], 'max_length', 100, 'Длина поля не должна превышать 100 символов.');
//Зададим новое сообщение при проверке на уникальность email адреса
//(взамен сообщения по умолчанию)
$form -> addRule('email', 'unique', true, 'Данный email адрес уже используется другим пользователем.');
//Новое сообщение при проверке на корректность email адреса
$form -> addRule('email', 'format', '/^[-a-z0-9_.]+@[-a-z0-9_.]+.[a-z]{2,5}$/i', 'Введите корректный e-mail');
//Новое сообщение (короткий формат) при проверке на корректности email адреса
$form -> addRule('email', 'format', '->', 'Введите корректный e-mail');
//Проверка повторного значения ввода пароля
$form -> addRule('password_repeat', 'must_match', 'password', 'Неверный повтор пароля');
//Ограничение по типам загружаемых файлов
$form -> addRule('photo', 'allowed_extensions', ['png', 'jpg'], 'Выберите файл png или jpg');
Удаление правила
Для удаления правила необходимо в метод removeRule() передать 2 аргумента: название поля и название правила, которое необходимо удалить.
//Не проверять минимальную длину
$form -> removeRule('name', 'max_length');
//Поле не обязательно для заполнения
$form -> removeRule('cupon', 'required');
//Поля не обязательны для заполнения
$form -> removeRule(['name', 'email'], 'required');
//Уберем проверку email на уникальность
$form -> removeRule('email', 'unique');
//Уберем проверку всех полей на максимальную длину
$form -> removeRule('*', 'max_length');
Отображение ошибок валидации
//Занесение данных POST в форму и валидация
$form -> submit() -> validate();
//Получить массив ошибок
$errors = $form -> getErrors();
//Добавить ошибку в общий список
$form -> addError('Текст ошибки.')
//Добавить ошибку для конкретного поля
$form -> addError('Текст ошибки.', 'content')
//Вывод всех ошибок одним списком
echo $form -> displayErrors();
//Вывод формы с ошибками, расположеными рядом с полями
echo $form -> setDisplayWithErrors() -> display();
Предыдущий раздел
Настройка полей формы