Ксапча Для Yii

Первой проблемой, с которой я столкнулся при работе с Yii, было отсутствие нормальной капчи.

Капча по умолчанию меня не устроила по ряду причин:

  • постоянно глючил (простым нажатием F5, иногда отображалось нормально, иногда отображалась пустая картинка, иногда картинка только с первым символом);
  • Сам алгоритм мне показался слишком простым (+используется только один шрифт);
  • Код на картинке не обновился при перезагрузке страницы.

Погуглив, я понял, что не один сталкиваюсь с подобными проблемами.

И вариант с рекапчей тоже «не вариант» — его невозможно было вписать в нужный мне дизайн (или я просто в нем плохо разбирался).

Потому что в своих проектах я обычно использую капчу «KCAPTCHA» ( http://captcha.ru/kcaptcha/ ), тогда я решил объединить существующую капчу от Yii и «KCAPTCHA».

И вот что я получил - glavweb.ru/public/download/kcaptcha.zip



Использование капчи
Прежде всего скачайте капчу отсюда glavweb.ru/public/download/kcaptcha.zip .

Далее вам необходимо распаковать архив в папку «protected/extensions» вашего приложения Yii. Итак, у вас будет такая структура: protected/ extensions/ kcaptcha/ fonts/ KCaptchaAction.php Поскольку расширение содержит только Action, а виджет и валидатор капчи стандартные, то как подключить капчу полностью описывать не буду, в рецептах это сделано достаточно хорошо - http://www.yiiframework.ru/doc/cookbook/ru/form.captcha .

Изменения касаются только контроллера, добавьте в него что-то вроде этого: public function actions()

{

return array(

'captcha'=>array(

'class' => 'application.extensions.kcaptcha.KCaptchaAction',

'maxLength' => 6,

'minLength' => 5,

'foreColor' => array(mt_rand(0, 100), mt_rand(0, 100),mt_rand(0, 100)),

'backColor' => array(mt_rand(200, 210), mt_rand(210, 220),mt_rand(220, 230))

)

);

}




Возможные параметры капчи
алфавит — Использован алфавит. По умолчанию — «0123456789abcdefghijklmnopqrstuvwxyz».

Не следует изменять без изменения файлов шрифтов.

разрешенные символы — Символы, используемые для рисования капчи, без похожих символов (o => 0, 1 => l, i => j, t => f).

По умолчанию — «23456789abcdeghkmnpqsuvxyz».

ширина — Ширина капчи.

Значение по умолчанию — 120. Не меняйте это значение без необходимости, эти параметры оптимальны.

высота — Высота капчи.

Значение по умолчанию — 60. Не меняйте это значение без необходимости, эти настройки оптимальны.

миндлина — Минимальное количество символов капчи.

По умолчанию — 6. максимальная длина — Максимальное количество символов капчи.

По умолчанию — 7. колебаниеАмплитуда — Вертикальная амплитуда колебаний символа, деленная на 2. По умолчанию — 5. нет пробелов — Запрет пробелов между символами.

По умолчанию истинно.

передний цвет — Цвет текста капчи в формате RGB. Принимает значение либо в виде массива, либо в виде строки, разделенной запятыми.

НазадЦвет — Цвет фона капчи в формате RGB. Принимает значение либо в виде массива, либо в виде строки, разделенной запятыми.

testLimit — Значение того, сколько раз будет отображаться одна и та же капча.

Влияет только на ошибочный ввод капчи (на простое обновление не влияет).

По умолчанию — 3. фиксированныйVerifyCode — Исправлен код проверки.

В основном это используется в автоматических тестах, где мы хотим воспроизводить один и тот же код проверки каждый раз, когда запускаем тесты.

По умолчанию равно нулю.

FontsDir — Абсолютный путь к каталогу со шрифтами.

По умолчанию установлено значение null, что означает, что используются шрифты, поставляемые с расширением.





Обновление кода изображения после перезагрузки страницы
А вот обновить код изображения после перезагрузки страницы оказалось немного сложнее.

Загвоздка в валидаторе «CCaptchaValidator», а точнее в его методе, отвечающем за клиентскую часть.

Даже если мы будем обновлять код проверки каждый раз при загрузке капчи, то в js (сгенерированном валидатором) мы все равно получим код с предыдущего изображения.

Это происходит потому, что запрос изображения происходит после загрузки страницы.

Те.

сначала в js-коде получаем сохраненный в сессиях код изображения, затем делается запрос в , сессия обновляется и в результате код с изображения не соответствует соответствующему коду в js (заметьте, естественно, в js это не сам код изображения, а его хеш).

Решение здесь либо переписать валидатор и обновить проверочный в валидаторе при отображении в js ($captcha-> getVerifyCode(true)) либо удалить сессию с кодом в действии, отвечающем за отображение формы с капча: // Refresh captcha Yii::import('application.extensions.kcaptcha.KCaptchaAction'); Yii::app()->session->remove(KCaptchaAction::SESSION_KEY); Теги: #Yii #captcha #KCAPTCHA #Yii

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2010-06-30 21:19:56
Баллов опыта: 1177
Всего постов на сайте: 4
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.