Кастомный валидатор полей для модуля веб-формы
Валидатор сделан для защиты от спама без включения капчи, для этого расскажу как написать свой валидатор.
Защищаться будем по схеме: добавляем в форму невидимое поле, если поле заполнено — к нам пришёл бот.
Предположим, форма у вас создана в модуле веб-форм. Заведём ещё одно служебное поле, с типом text
, поля типа hidden
боты иногда игнорируют и не заполняют. Название выбираем обычное, например user
или name
, это важно!
Нам нужно проверять поле на пустоту, по умолчание доступны валидаторы среди которых нет нужного:
- [number_ext] Число в пределах
- [text_len] Длина строки
- [number] Целое число
- [INN] Проверка ИНН
Документация по написанию своих валидаторов тут. Там всё просто: пишем PHP-класс с нужными методами и подвешиваем его на нужное событие.
Получился класс валидатора form_validator_string_empty.php
:
/local/php_interface/form_validator_string_empty.php<?php
namespace Hmarketing\Form\Validation;
class Stringempty
{
static function getDescription()
{
return array(
// идентификатор
'NAME' => 'empty_string',
// наименование
'DESCRIPTION' => 'Пустая строка',
// типы полей
'TYPES' => array('text'),
// метод, возвращающий массив настроек
'SETTINGS' => array(__CLASS__, 'getSettings'),
// метод, конвертирующий массив настроек в строку
'CONVERT_TO_DB' => array(__CLASS__, 'toDB'),
// метод, конвертирующий строку настроек в массив
'CONVERT_FROM_DB' => array(__CLASS__, 'fromDB'),
// валидатор
'HANDLER' => array(__CLASS__, 'doValidate')
);
}
static function getSettings()
{
return array();
}
static function toDB($arParams)
{
// возвращаем сериализованную строку
return serialize($arParams);
}
static function fromDB($strParams)
{
// никаких преобразований не требуется, просто вернем десериализованный массив
return unserialize($strParams);
}
static function doValidate($arParams, $arQuestion, $arAnswers, $arValues)
{
global $APPLICATION;
foreach ($arValues as $value) {
// проверяем на пустоту, или любую другую логику
if (strlen(trim($value)) > 0) {
// вернем ошибку
$APPLICATION->ThrowException('Ошибка заполнения полей формы');
return false;
}
}
// все значения прошли валидацию, вернем true
return true;
}
}
Валидатор нужно подключить в файле int.php
:
/local/php_interface/init.php// класс кратко и долгосрочной регистрации обработчиков событий
$eventManager = \Bitrix\Main\EventManager::getInstance();
// регистрируем класс в системе
Bitrix\Main\Loader::registerAutoloadClasses(
null,
array(
// ключ - имя класса с простанством имен, значение - путь относительно корня сайта к файлу
"Hmarketing\Form\Validation\Stringempty" => "/local/php_interface/form_validator_string_empty.php",
)
);
// добавляем новый валидатор
$eventManager->addEventHandler(
'form',
'onFormValidatorBuildList',
array('Hmarketing\Form\Validation\Stringempty', 'getDescription')
);