Известна проблема, если в форме используется AjaxValidation, то каптча в ней работает не правильно.
Когда включаем Ajax Validation в виде виджета формы добавления комментария, captcha каждый раз при отправке комментария, выдает ошибку несоответствия. Получается, что когда форма верна, капча меняется в фреймворке, но на странице отображается старая капча.
Решение (добавляем 'on'=>'insert'
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function rules() { return array ( array ( 'verifyCode', 'captcha', 'allowEmpty'=>!Yii::app()->user->isGuest || !extension_loaded('gd'), 'on'=>'insert' ), ); } |
Теперь в контроллере дополняем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
protected function newComment($material) { //создаём модель Comment и задаём её сценарий как 'insert' $comment=new Comment('insert'); if(isset($_POST['ajax']) && $_POST['ajax']==='comment-form') //тут ajax-валидация { //метод, устанавливающий сценарий 'ajax' для модели $comment, созданной выше $comment->setScenario('ajax'); echo CActiveForm::validate($comment); Yii::app()->end(); } if(isset($_POST['Comment'])) { $comment->attributes=$_POST['Comment']; if($material->addComment($comment)) { if($comment->status==Comment::STATUS_PENDING) Yii::app()->user->setFlash('commentSubmitted', 'Благодарим Вас за комментарий.'); $this->refresh(); } } return $comment; } |
$comment=new Comment('insert');
эквивалентно:
1 2 |
$comment=new Comment; //создаём модель $comment->scenario='insert'; // задаём ей сценарий |
Всё просто:
- когда работает ajax-валидация, то учитываются все правила из rules, за исключением Captcha (потому что она срабатывает только на сценарий insert);
- когда жмём кнопку (отправляем форму с данными), всё валидируется и сохраняется (send() сам по умолчанию ещё выполняет validation() перед сохранением).
Теперь ajax проверка не срабатывает на Captcha, а значит та не будет обновляться по асинхронному запросу (невидимо для нас, отсюда ошибки, когда мы видя старую капчу вводим символы с неё, а сравниваются они уже с обновлённой капчей, Qiang Xue в комментариях говорил использовать testLimit и ставить его в “0”, “-1”, и т.д. ). Но мы ставим капчу в конец, перед кнопкой отправить. А нажатие кнопки и так вызовет проверку, но уже правильную, без исключения.
Просмотров : 8510
что блядь за бред вы несете ?????
А как Вам такое решение – https://github.com/yiisoft/yii/issues/4008