Yii: Не работает CAPTCHA при включении ajax-валидации. Помогите себе с нами.
Это важно научиться понимать. Ajax Validation или Ajax проверка полей на лету - хорошее дело. Yii обладает такой возможностью. И этим надо пользоваться.
Когда мы только-только добавили возможность комментирования на Loco.ru, естественно мы добавили к форме комментирования проверку с помощью капчи. Мы тогда рассчитывали что всё заработает, но Ajax валидацию пришлось отключить, чтобы Captcha оставалась работоспособна (включали 'enableAjaxValidation'=>true, капча начинала писать ошибку, что код не прошёл проверку). Вобщем "забили" тогда на ajax-помпезность*.
Итак, пришло знание и свет пролился на эту проблему. Если захотите написать комментарий или написать через форму обратной связи, вы увидите как поля проверяются на лету и вам выдаётся ошибка, если что-то неверно. Разбираемся как это сделать. Прежде всего нам помогла тема с форума.
1. В форме views/comment/_form.php включаем ajax валидацию:
'enableAjaxValidation'=>true,
2. В правила модели добавляем сценарий для проверки капчи. Это делается свойством - 'on'. Когда его нет, то считается, что правило используется для всех сценариев. Если оно есть, то сожержит список сценариев, к которым применяется валидатор.
public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( ... // verifyCode needs to be entered correctly array('verifyCode', 'captcha', 'allowEmpty'=>!Yii::app()->user->isGuest || !extension_loaded('gd'), 'on'=>'insert'), ); }
3. Теперь в контроллере дополняем:
protected function newComment($material) { ... $comment=new Comment('insert'); //создаём модель Comment и задаём её сценарий как 'insert' if(isset($_POST['ajax']) && $_POST['ajax']==='comment-form') //тут ajax-валидация { $comment->setScenario('ajax'); //метод, устанавливающий сценарий 'ajax' для модели $comment, созданной выше echo CActiveForm::validate($comment); Yii::app()->end(); } if(isset($_POST['Comment'])) { $comment->attributes=$_POST['Comment']; //if($comment->validate($comment->attributes)){ if($material->addComment($comment)) { if($comment->status==Comment::STATUS_PENDING) Yii::app()->user->setFlash('commentSubmitted','Благодарим Вас за комментарий. После модерации он будет опубликован.'); $this->refresh(); } //} } return $comment; }
$comment=new Comment('insert'); эквивалентно:
$comment=new Comment; //создаём модель $comment->scenario='insert'; // задаём ей сценарий
Таким образом, используя сценарий, мы ввели исключение. Какое и зачем?
Всё просто:
- когда работает ajax-валидация, то учитываются все правила из rules, за исключением Captcha (потому что она срабатывает только на сценарий insert);
- когда жмём кнопку (отправляем форму с данными), всё валидируется и сохраняется (send() сам по умолчанию ещё выполняет validation() перед сохранением).
Теперь ajax проверка не срабатывает на Captcha, а значит та не будет обновляться по асинхронному запросу (невидимо для нас, отсюда ошибки, когда мы видя старую капчу вводим символы с неё, а сравниваются они уже с обновлённой капчей, Qiang Xue в комментариях говорил использовать testLimit и ставить его в "0", "-1", и т.д. ). Но мы ставим капчу в конец, перед кнопкой отправить. А нажатие кнопки и так вызовет проверку, но уже правильную, без исключения.
Вот как будет это выглядеть:
*Помпезность — подчёркнутая пышная торжественность, тяжеловесность и монументальность, великолепие.
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Yii: Установка и настройка Yii-app заготовки приложения от Crisu83 (09.03.2014)
- 0 Twitter Bootstrap Carousel Crossfade (09.09.2013)
3 комментариев