Yii: Добавляем капчу к комментариям у статей, CAPTCHA и не-Ajax Validation (проверка на лету)
Вставляем в файл вида для комментариев - views/comment/_form.php:
<?php if (extension_loaded('gd')): ?> <div class="row"> <?php echo CHtml::activeLabelEx($model, 'verifyCode') ?> <div> <?php $this->widget('CCaptcha'); ?> <?php echo CHtml::activeTextField($model,'verifyCode'); ?> </div> <div class="hint">Please enter the letters as they are shown in the image above. <br/>Letters are not case-sensitive.</div> </div> <?php endif; ?>
В models/Comment.php, добавляем:
1. public $verifyCode;
2. в rules() дописываем:
array('verifyCode', 'captcha', 'allowEmpty'=>!Yii::app()->user->isGuest),
3. В attributeLabels():
'verifyCode' => 'Verification Code',
В controllers/PostController.php:
1. добавляем функцию actions():
public function actions() { return array( 'captcha'=>array( 'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF, ), ); }
2. Теперь вроде всё сделано, но капча не показывается. Смотрим в код CCaptcha, в функцию renderImage(), и видим, что url картинки не разрешён в accessRules в PostController. Добавляем правило:
array('allow', 'actions'=>array('captcha'), 'users'=>array('*'), ),
Таким образом мы вставим капчу и она будет работать, но при 'enableAjaxValidation'=>false.
Когда включаем Ajax Validation в виде виджета формы добавления комментария, captcha каждый раз при отправке комментария, выдает ошибку несоответствия. Получается, что когда форма верна, капча меняется в фреймворке, но на странице отображается старая капча.
Мы хотим настроить, чтобы работала динамичная проверка, то смотрим замечания Qiang Xue:
- As described in CActiveForm, you shouldn't use ajax validation when the validationwould change server side state. The CAPTCHA implementation uses session to store thenumber of tests that have been attempted. This should be considered as server sidestate. If you want to limit the test limit, you should not use ajax validationbecause it simply doesn't make sense. If you want to use ajax validation, you shouldset the test limit to be unlimited.
- How to set the limit to be unlimited? setting testlimit to zero,"-1" or a big number?
- set testLimit to be 0 or negative value
P.S. Ура! Теперь мы разобрались как делать Ajax'овую проверку вместе с Captcha (читайте тут).
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)
4 комментариев
Не понятно куда, что добавляем:
Поясните пожалуйста.
в контроллере, у меня это PostController.php, вверху есть метод accessRules. В него и надо вписать код, разрешающий выполнение action "captcha" для этого контроллера для всех пользователей (незарегистрированных в общем случае).
Сделал всё как тут сказано, но картинка появляется только для зарегистрированных пользователей.
Виталий, проверяйте accessRules