Yii Framework Forum: Ajax Валидация Уникального Поля? - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

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

#1 User is offline   TheStik 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 20-June 13

Posted 01 July 2013 - 12:35 PM

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

#2 User is offline   Charger 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 317
  • Joined: 03-September 11

Posted 02 July 2013 - 12:04 AM

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

#3 User is offline   TheStik 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 20-June 13

Posted 02 July 2013 - 02:10 AM

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

#4 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 298
  • Joined: 15-April 13
  • Location:Ukraine

Posted 02 July 2013 - 02:57 AM

'enableClientValidation' => true,

Если непоможет:
'enableAjaxValidation' => true,

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

#5 User is offline   TheStik 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 20-June 13

Posted 02 July 2013 - 04:07 AM

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

#6 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 298
  • Joined: 15-April 13
  • Location:Ukraine

Posted 02 July 2013 - 04:27 AM

View PostTheStik, on 02 July 2013 - 04:07 AM, said:

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

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

#7 User is offline   Charger 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 317
  • Joined: 03-September 11

Posted 02 July 2013 - 04:45 AM

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

#8 User is offline   TheStik 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 20-June 13

Posted 02 July 2013 - 04:53 AM

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

#9 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 298
  • Joined: 15-April 13
  • Location:Ukraine

Posted 02 July 2013 - 06:24 AM

Проверка на уникальности это проверка на стороне сервера а не клиента, а значит нужен 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

#10 User is offline   TheStik 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 20-June 13

Posted 02 July 2013 - 07:16 AM

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

#11 User is offline   TheStik 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 20-June 13

Posted 02 July 2013 - 03:30 PM

Да, отлично все работает. Пару вопросов по коду:
1. Что означает 'validateOnSubmit'=>true,? Убрал строчку, так как валидация после отправки формы не срабатывала
2. Что за условие if($error!='[]') ? Если убрать, ничего не изменится
0

#12 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 298
  • Joined: 15-April 13
  • Location:Ukraine

Posted 03 July 2013 - 01:37 AM

1. validateOnSubmit означает что аякс валидация будет проходить при сабмите формы. Если же на форме есть ошибки то сабмита небудет.
2. CActiveForm::validate() как я упоминал выше возвращает json массив. Если валидация вернула пустой массив мы выйдем из условия. Если убрать эту строку вы не выйдете из ошибок, и ваше приложение всегда будет заканчиваться на строке
echo $error;Yii::app()->end();
. С обычной кнопкой это сработает а вот с ajaxsubmitbutton будут проблемы.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users