Как на Yii капче выводить цифры
Рубрика: Работаем с капчей (captcha)
30 Апр. 2009Сегодня мы поговорим с вами о том как изменить генератор символов на капче. Часто мне стали приходить сообщения на почту (да и в комментариях часто вижу) что народ интересует как на капче выводить только цифры или буквы русского алфавита.
---В принципе в изменении генератора символов на капче нет ничего сложного и тут как всегда API нам в помощь. Зайдя на страницу по CCaptchaAction я начал искать метод который бы содержал в себе слова generate. Не долго занимаясь поиском я нашел функцию generateVerifyCode которая потом как оказалась и является тем самым генератором.
/**
* Generates a new verification code.
* @return string the generated verification code
*/
protected function generateVerifyCode()
{
if($this->minLength<3)
$this->minLength=3;
if($this->maxLength>20)
$this->maxLength=20;
if($this->minLength>$this->maxLength)
$this->maxLength=$this->minLength;
$length=rand($this->minLength,$this->maxLength);
$letters='bcdfghjklmnpqrstvwxyz';
$vowels='aeiou';
$code='';
for($i=0;$i<$length;++$i)
{
if($i%2 && rand(0,10)>2 || !($i%2) && rand(0,10)>9)
$code.=$vowels[rand(0,4)];
else
$code.=$letters[rand(0,20)];
}
return $code;
}
На первую часть функции можем не обращать внимание т.к. там идет простая проверка что б кол-во символов было не меньше трёх и не больше двадцати.
А вот следующие строчки после этого имеют к нам непосредственное отношение:
$letters='bcdfghjklmnpqrstvwxyz';
$vowels='aeiou';
В переменную $letters записываютсяa символы которые могут быть сгенерированы на капче, в переменную $vowels - гласные, которые также могут быть на капче. Вы могли бы прямо здесь поменять символы которые будут выводится на капче и написать там к примеру:
$letters='1234567890';
но это будет очень не красивым решением. Как мы все помним Yii у нас отличный ООП фреймворк поэтому что бы не изменять код главных классов фреймворка (который с выходом нового релиза будет перезатёрт) мы просто создадим свой клас и унаследуем его от CCaptchaAction.
Давайте зайдем в protected/components/ и создадим там файлик MyCCaptchaAction:
class MyCCaptchaAction extends CCaptchaAction
{
/**
* Generates a new verification code.
* @return string the generated verification code
*/
protected function generateVerifyCode()
{
if($this->minLength<3)
$this->minLength=3;
if($this->maxLength>20)
$this->maxLength=20;
if($this->minLength>$this->maxLength)
$this->maxLength=$this->minLength;
$length=rand($this->minLength,$this->maxLength);
// Тут указываем символы которые будут
// выводится у нас на капче.
$letters='1234567890';
$code='';
for($i=0;$i<$length;++$i)
{
$code.=$letters[rand(0, strlen($letters)-1)];
}
return $code;
}
}Что мы сделали:
- Создали новый класс с именем MyCCaptchaAction и унаследовали CCaptchaAction.
- Переопределили функцию generateVerifyCode
- Изменили внутри функции переменные $letters и $vowels что бы они содержали цифры от нуля до девяти.
Как вы понимаете если вместо цифр вы хотите выводить на капче только русские буквы - перечислите их в переменной $letters.
Внимание: Если вы будете использовать русские символы в капче - посетители из других стран не смогут пройти у вас регистрацию. Также с русскими буквами могут быть проблемы при валидации поэтому настоятельно рекомендую кириллицу не использовать.
Теперь после этого нам надо зайти в контроллер который у вас отвечает за вывод капчи. Найдите там метод actions() и замените:
'class'=>'CCaptchaAction',
на
'class'=>'MyCCaptchaAction',
После этого заходите на страницу и смотрите как изменилась ваша капча.
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Буквально пару дней назад закончилась вторая Международная конференция "FOSS Sea" в Одессе. Как вы понимаете я являлся одним из ... "FOSS Sea 2009"
- Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Добавляем Captcha на страницу"
- ... "Art"

[adm] zolter
Было сказано: Четверг, 30 Апрель 2009
Как и обещал :)
Правда у себя решил цифры не ставить в капче т.к. это немного снижает безопасность.

So1
Было сказано: Пятница, 01 Май 2009
Отлично. Спасибо - я уже хотел было копаться. но Вы меня опередили.
Можно еще в MyCCaptchaAction добавить переменную $symbols
Тогда в контроллере мы просто пишем
'backColor'=>0xFFFFFF, 'symbols'=>'1234567890'

[guest] Mobelis
Было сказано: Среда, 14 Сентябрь 2011
А как можно изменить метод renderImage что бы символы капчи были разного цвета или цвет рендомно каждому символу задавался из диапазона оттенков?

[guest] Mobelis
Было сказано: Четверг, 15 Сентябрь 2011
По замыслу все четные одного цвета все не четные другого. Просто думал может кто сталкивался. И сможет показать код готового решение. Очень странно что никто не поднимал этот вопрос. Да и менять там не так уж и много.


