AjaxValidation

Выкладываем свои наработки

AjaxValidation

Сообщение pirrat » 2010.03.06, 04:06

Расширение ещё сырое, но при этом вполне работоспособное.
Появилась задача - провести валидацию формы без перезагрузки страницы. При этом форма может отображаться в любом месте сайта, а отправляться на определенный 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: извиняюсь за сумбурность изложения. если появится интерес, расскажу все подробнее.
Последний раз редактировалось pirrat 2010.03.06, 15:21, всего редактировалось 2 раз(а).
CI(3проекта) -> Kohana (4 проекта) -> Yii (4 проекта)
pirrat
 
Сообщения: 168
Зарегистрирован: 2009.04.03, 09:41

Re: AjaxValidation

Сообщение pirrat » 2010.03.06, 12:59

Приведу краткие примеры кода: контроллера, отображения, модели.

Модель - обычный Cmodel с ссписком правил.
Код: Выделить всё
class LoginForm extends CFormModel
{
    public $username;
    public $password;
    public $rememberMe;

    public function rules()
    {
        return array(    
            array
('username, password', 'required'),
            array('password', 'authenticate'),
        );
    } 


Контроллер site

action login, такой же как и обычно:
Код: Выделить всё
    public function actionLogin()
    {
        $form=new LoginForm;
        if(isset($_POST['LoginForm']))
        {
            $form->attributes=$_POST['LoginForm'];
            $valid = $form->validate();
            if($valid)
            {
                $refferer = Yii::app()->request->getUrlReferrer();  
                $this
->redirect($url);
            }
        }
        $this->render('login',array('form'=>$form));
    } 


метод filters, контроллера site:

Код: Выделить всё
    public function filters()
    {
        return array(
                array(
                   'ext.ajaxValidation.AjaxValidationFilter + login',
                ),
        );
    } 


ну и собственно сама форма, которая может рендериться где угодно, но action её ведет на /site/login
Код: Выделить всё

<?
$form
=new LoginForm;

 echo Xhtml::beginForm(array('/site/login'),'post'); ?>
<? echo XHtml
::ajaxValidation('LoginForm');?>

<?php echo Chtml::activeLabel($form,'username'); ?>
<?php echo Chtml
::activeTextField($form,'username') ?>

<?php echo Chtml::activeLabel($form,'password'); ?>
<?php echo Chtml
::activePasswordField($form,'password') ?>

<?php echo Chtml::submitButton('Login'); ?>

<?php echo Chtml::endForm(); ?>


Как видите, основной код совершенно не затрагивается, а лишь добавляется фильтр и одна строка в отображение формы.
Последний раз редактировалось pirrat 2010.03.06, 14:43, всего редактировалось 1 раз.
CI(3проекта) -> Kohana (4 проекта) -> Yii (4 проекта)
pirrat
 
Сообщения: 168
Зарегистрирован: 2009.04.03, 09:41

Re: AjaxValidation

Сообщение Ekstazi » 2010.03.06, 13:24

Похоже на CActiveForm
Ekstazi
 
Сообщения: 442
Зарегистрирован: 2009.08.20, 22:54

Re: AjaxValidation

Сообщение pirrat » 2010.03.06, 13:37

вот емае, как то CActiveForm вообще пропустил мимо глаз, нашел в исходниках trunk ветки.
действительно похоже.
щас поизучаю и возможно откажусь от своего решения в пользу CActiveForm.
CI(3проекта) -> Kohana (4 проекта) -> Yii (4 проекта)
pirrat
 
Сообщения: 168
Зарегистрирован: 2009.04.03, 09:41

Re: AjaxValidation

Сообщение pirrat » 2010.03.06, 14:27

потестил. мде, видимо зря потратил время, CActiveForm явно будет мощнее, хотя и чуть сложнее настраивается...
CI(3проекта) -> Kohana (4 проекта) -> Yii (4 проекта)
pirrat
 
Сообщения: 168
Зарегистрирован: 2009.04.03, 09:41

Re: AjaxValidation

Сообщение Ekstazi » 2010.03.06, 14:31

Ну почему же зря, можно вполне продвигать как альтернативу CActiveForm. Конкуренция будет так сказать, а когда есть конкуренция прогресс быстрее идет.
Ekstazi
 
Сообщения: 442
Зарегистрирован: 2009.08.20, 22:54

Re: AjaxValidation

Сообщение pirrat » 2010.03.06, 14:37

ну да, тоже верно.
в своем решении я вижу пока только одно преимущество - использование фильтра: не приходится влезать в код экшена.
CI(3проекта) -> Kohana (4 проекта) -> Yii (4 проекта)
pirrat
 
Сообщения: 168
Зарегистрирован: 2009.04.03, 09:41


Вернуться в Авторский код и библиотеки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1