Появилась задача - провести валидацию формы без перезагрузки страницы. При этом форма может отображаться в любом месте сайта, а отправляться на определенный action.
Плагины типа jquery.validate отпали, из-за их громоздкости и определенной сложности в настройки (например валидация капчи).
http://www.yiiframework.com/extension/jformvalidate/ тоже не совсем подошло.
Подумал и решил - а зачем делать валидацию на клиенте, если можно её делать на сервере, а ошибки получать аяксом.
Ну собственно так и было написано это расширение, при этом старался сделать так, чтобы было меньше изменений в коде( в итоге надо править только отображение).
Примеры работы можно посмотреть тут:
http://bu.pirrat.ru/site/main (В IE не смотреть=))
там ссылка : Регистрация, при нажатии увидите формe.
попробуйте ввести туда неправильные данные.
Алгоритм работы примерно следующий:
При отправки формы, делается аякс запрос на сервер, если с сервера пришло сообщение об ошибки, то форма не отправляется на сервер, а выдаются сообщения об ошибке, если ошибок нет, форма отправляется как обычно.
Настройка довольна простая:
У вас есть метод на который отправляется форма, допустим site::actionLoign
в этом контроллере настраиваем фильтры:
- Код: Выделить всё
public function filters()
{
return array(
array(
'ext.ajaxValidation.AjaxValidationFilter + login',
),
);
}
мы тут сказали что для экшена login использовать фильтр AjaxValidationFilter
далее в форме которой мы хотим валидировать, добавляем строку, после тега формы:
- Код: Выделить всё
<? echo XHtml::ajaxValidation('LoginForm');?>
1 параметр - название модели(массив названий), которые надо валидировать.
2 параметр (опционально)- название сценария.
Поля в форме у вас должны быть созданы через хелпер Chtml
Например Chtml::activePasswordField , это связанно с тем что такие поля содержат атрибуты в определенном формате.
ну и так же в css у вас должны быть правила, на подобии таких:
- Код: Выделить всё
div.form label.error,
div.form span.error,
div.form div.error
{
color: #C00;
}
div.form input.error,
div.form textarea.error,
div.form select.error
{
background: #FEE;
border-color: #C00;
}
все готово и должно работать.
скачать - http://bu.pirrat.ru/ajax_validation.zip
разархивировать в extensions.
PS: извиняюсь за сумбурность изложения. если появится интерес, расскажу все подробнее.
