Ajax Валидация Уникального Поля?

Возможно ли? Ajax валидацию подключил, все остальные правила проверяет, но уникальность логина только после отправки формы

Должно работать, по умолчанию AJAX запрос на проверку отправляется после покидания курсором поля, может вы все время находитесь в поле логина и ждете проверки?

Нет конечно :D ведь длину логина проверяю нормально


'enableClientValidation' => true,



Если непоможет:




'enableAjaxValidation' => true,



И почитайте как в этом случае вести себя на серверной части.

Да пробовал, дело ни в этом. Ведь при вызове rules() значения атрибутов пусты? Естественно совпадений не будет, так как будет сравниваться с NULL. Скорей всего нужен отдельный метод?

Как это пусты?

rules() используются при валидации, а именно когда вы делаете $model->validate(). Если вы перед этим не присваиваете атрибуты модели то что вы пытаетесь сделать?

Отдельный метод не нужен. Стандартный валидатор справляется на отлично.

Проверьте то как вы делаете валидацию, так как что то у вас не то.

У вас точно что-то не так. Модель и контроллер вы генерировали с помощью Gii или сами писали?

Можете выложить код на Gist или тут (если не много) ?

http://upwww.ru/?id=5571

Проверка на уникальности это проверка на стороне сервера а не клиента, а значит нужен AJAX.

Конфиг cactiveform при этом приблизительно таков:


$form=$this->beginWidget('CActiveForm', array(

    'id'=>'registration-form',

    'enableClientValidation'=>true,

    'enableAjaxValidation'=>true, // <<<<------ валидация по AJAX

    'clientOptions'=>array(

        'validateOnSubmit'=>true,

        'validateOnChange' => true,

    ),

));

То далее вы должны действия проводить в контроллере. Там должно быть что то подобное:




if(Yii::app()->request->isAjaxRequest)

			{

			$error=CActiveForm::validate($model);

			if($error!='[]') {

				echo $error;Yii::app()->end();

			}}



Тоесть теперь ошибки передаются json массивом.

Далее все как обычно




if(isset($_POST['User'])&& ($_POST['ajax']!='user-form') )

	{

        $model->attributes=$_POST['User'];

            if($model->validate()){

...........



В разделе tips&snippets есть пример реализации данной валидации с ajaxSubmitButton. Рекомендую прочитать.

Также есть вариант вместо cactiveform::validate делать $model->validate. Тогда массив ошибок составляется вот так:




if(Yii::app()->request->isAjaxRequest)

        {

            if(!$model->validate()){

                foreach($model->getErrors() as $attribute=>$errors)

                    $error[CHtml::activeId($model,$attribute)]=$errors;

                echo CJSON::encode($error);

                Yii::app()->end();

              }

        }



И напоследок вы ведь не будете сохранять пароль без соли(хеша)?

Большое спасибо за столь подробное объяснение, позже попробую, уже не соображаю

Да, отлично все работает. Пару вопросов по коду:

  1. Что означает ‘validateOnSubmit’=>true,? Убрал строчку, так как валидация после отправки формы не срабатывала

  2. Что за условие if($error!=’[]’) ? Если убрать, ничего не изменится

  1. validateOnSubmit означает что аякс валидация будет проходить при сабмите формы. Если же на форме есть ошибки то сабмита небудет.

  2. CActiveForm::validate() как я упоминал выше возвращает json массив. Если валидация вернула пустой массив мы выйдем из условия. Если убрать эту строку вы не выйдете из ошибок, и ваше приложение всегда будет заканчиваться на строке


echo $error;Yii::app()->end();

. С обычной кнопкой это сработает а вот с ajaxsubmitbutton будут проблемы.