Валидация данных в LiveStreet 0.6
В транковую версию LS на github.com добавлен новый функционал — валидация данных и полей сущностей. Этот функционал призван заменить функцию func_check(). За основу был взят функционал валидации Yii.
На данный момент доступны следующие типы валидации:
Правила задаются в виде элементов массива. Первый элемент — список полей к которым необходимо применить валидацию, второй — тип валидатора или имя метода для кастомной валидации, остальные элементы — перечисление параметров, которые передаются в валидатор.
В первом правиле мы задаем проверку полей login и name на длину от 3 до 7 символов. Во втором задаем проверку поля title через кастомный тип валидатора «my» — если существует метод ValidateMy() у сущности, то он будет использован в качестве валидатора, если его нет, попытается найти стандартный валидатор с типом «my».
У всех валидаторов есть общие параметры:
Валидация сущности:
Метод _Validate() запускает валидацию согласно описанным правилам в сущности.
Если необходимо при валидации использовать только определенные правила(параметр on), то перед методом валидации необходимо вызвать _setValidateScenario():
По умолчанию при валидации используются только правила БЕЗ сценария. Хотя этот момент спорный и возможно по дуфолту будет лучше использовать все правила в независимости от сценария.
Использовать валидацию без сущности можно так:
Данный подход к валидации позволит не дублировать код проверки полей и использовать его многократно, например, при обычной и ajax валидации.
На данный момент доступны следующие типы валидации:
- Boolean — проверка значения на булевый тип
- Date — проверка значения на формат даты и времени
- Email — проверка корректности емайл
- Inline — валидация произвольным методом сущности или другого объекта
- Number — проверка на числа
- Required — проверка на пустое или конкретное значение
- String — проверка строк на длину
- Type — проверка на тип значения
- Url — проверка на корректность URL
Как использовать
В сущности необходимо составить список правил валидации.class PluginTest_ModuleMain_EntityTest extends Entity {
protected $aValidateRules=array(
array('login, name','string','max'=>7,'min'=>'3'),
array('title','my','on'=>'register'),
);
public function ValidateMy($sValue,$aParams) {
if ($sValue!='Мега заголовок') {
return 'Ошибочный заголовок';
}
return true;
}
}
Правила задаются в виде элементов массива. Первый элемент — список полей к которым необходимо применить валидацию, второй — тип валидатора или имя метода для кастомной валидации, остальные элементы — перечисление параметров, которые передаются в валидатор.
В первом правиле мы задаем проверку полей login и name на длину от 3 до 7 символов. Во втором задаем проверку поля title через кастомный тип валидатора «my» — если существует метод ValidateMy() у сущности, то он будет использован в качестве валидатора, если его нет, попытается найти стандартный валидатор с типом «my».
У всех валидаторов есть общие параметры:
- bSkipOnError — пропускать валидацию, если по этому полю уже есть ошибка
- label — название поля валидации, выводится в тексте сообщения, по умолчанию используется имя поля
- msg — текст сообщения об ошибке, позволяет переопределить стандартное сообщение.
- msgId — id текстовки из языкового файла для переопределения сообщения об ошибке, аналог msg
- on — список сценариев в которых необходимо применять данное правило
Валидация сущности:
$oObject=Engine::GetEntity('PluginTest_ModuleMain_EntityTest');
$oObject->setLogin('bolshoi login');
$oObject->setTitle('zagolovok');
if ($oObject->_Validate()) {
var_dump("OK");
} else {
var_dump($oObject->_getValidateErrors());
}
Метод _Validate() запускает валидацию согласно описанным правилам в сущности.
Если необходимо при валидации использовать только определенные правила(параметр on), то перед методом валидации необходимо вызвать _setValidateScenario():
$oObject->_setValidateScenario('register');
$oObject->_Validate();
в данном случаи будут использованы только правила, у которых в параметре on указан сценарий register.По умолчанию при валидации используются только правила БЕЗ сценария. Хотя этот момент спорный и возможно по дуфолту будет лучше использовать все правила в независимости от сценария.
Использовать валидацию без сущности можно так:
if (!$this->Validate_Validate('url','http://livestreet.ru')) {
var_dump($this->Validate_GetErrors());
}
Данный подход к валидации позволит не дублировать код проверки полей и использовать его многократно, например, при обычной и ajax валидации.
24 комментария
контроллерыэкшены уменьшаться хоть немного, и функционал валидации уйдет вмоделисущности.*Thumbs Up*
Быть может сделать так, чтобы метод _getValidateErrors() возвращал одномерный массив? Или есть более простой способ вывода мессага пользователю с помощью модуля Message без двух итераций?
Пробовал так:
— не работает, все время выдает ошибку
В ActionIndex получаю некоторые параметры из URL для дальнейших действий. Валидирую способом, описанным в статье, с помощью своего валидатора (по регулярному выражению). Валидация проходит успешно.
Подскажите, пожалуйста, как правильно вывести сообщение об ошибки валидации стандартным способом. Реально ли это на главной странице, без костылей?
Спасибо!
docs.livestreetcms.com/api/1.0/Entity#_getValidateError-detail
docs.livestreetcms.com/api/1.0/Entity#_getValidateErrors-detail