DbHelp.ru
Маленький Yii блог
Комментарии
Гость: Намереваетесь оттрахать три киски сразу, обратите взо...
Гость: «Халва» - Карта Рассрочки взять кредит частный займ ...
Гость: Регистрируешься - огромный бонусы. Играешь - огромный ...
Гость: Быстро и качественно придам вашему фото идеальный вид....
Гость: Информативно,продолжай в том же духе [url=http://forum.oncolo...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Как на Yii капче выводить цифры

Рубрика: Работаем с капчей (captcha)

Оцените эту статью:

Рейтинг: 0.00 (0)
30 Апр. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Сегодня мы поговорим с вами о том как изменить генератор символов на капче. Часто мне стали приходить сообщения на почту (да и в комментариях часто вижу) что народ интересует как на капче выводить только цифры или буквы русского алфавита.

---

В принципе в изменении генератора символов на капче нет ничего сложного и тут как всегда 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;
    }
}


Что мы сделали:

  1. Создали новый класс с именем MyCCaptchaAction и унаследовали CCaptchaAction.
  2. Переопределили функцию generateVerifyCode
  3. Изменили внутри функции переменные $letters и $vowels что бы они содержали цифры от нуля до девяти.

Как вы понимаете если вместо цифр вы хотите выводить на капче только русские буквы - перечислите их в переменной $letters.

Внимание: Если вы будете использовать русские символы в капче - посетители из других стран не смогут пройти у вас регистрацию. Также с русскими буквами могут быть проблемы при валидации поэтому настоятельно рекомендую кириллицу не использовать.

Теперь после этого нам надо зайти в контроллер который у вас отвечает за вывод капчи. Найдите там метод actions() и замените:

 'class'=>'CCaptchaAction',

на

 'class'=>'MyCCaptchaAction',

После этого заходите на страницу и смотрите как изменилась ваша капча.



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Пожалуй новость про появление новой версии yii пишу позже всех т.к. мой интернет провайдер решил что на майских празниках я ... "Релиз Yii framework 1.1.2"

  2. Как часто в проектах вы сталкиваетесь с загрузкой картинок? Если в своей работе вы используете thumb-pics (уменьшенные картинки) — тогда ... "Обзор дополнения EasyPhpThumb"

  3. Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Настройка 3d капчи на Yii"

[adm] zolter

Было сказано: Четверг, 30 Апрель 2009

Как и обещал :)
Правда у себя решил цифры не ставить в капче т.к. это немного снижает безопасность.

So1

Было сказано: Пятница, 01 Май 2009

Отлично. Спасибо - я уже хотел было копаться. но Вы меня опередили.
Можно еще в MyCCaptchaAction добавить переменную $symbols
Тогда в контроллере мы просто пишем

'backColor'=>0xFFFFFF, 'symbols'=>'1234567890'

[adm] zolter

Было сказано: Вторник, 05 Май 2009

да, действительно. :)

[guest] Mobelis

Было сказано: Среда, 14 Сентябрь 2011

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

[guest] maxx

Было сказано: Четверг, 15 Сентябрь 2011

Там достаточно много менять придется

[guest] Mobelis

Было сказано: Четверг, 15 Сентябрь 2011

По замыслу все четные одного цвета все не четные другого. Просто думал может кто сталкивался. И сможет показать код готового решение. Очень странно что никто не поднимал этот вопрос. Да и менять там не так уж и много.

[guest] Гость

Было сказано: Пятница, 16 Март 2012

Если будет минутка, плиз напишите как математику как у Вас в капче сделать. Тоже согласен с тем что одни цифры не безопасно, а математика получше да и веселее как-то )

[guest] zolter

Было сказано: Суббота, 17 Март 2012

Вот тема по математической капче http://www.dbhelp.ru/mathematics-captcha/page/

[guest] Алекс

Было сказано: Четверг, 16 Май 2013

У меня почему-то капча не обновляется. Тоесть от перехода с одной странице к другой - капча таже. Если открыть в другом браузере/или почистить сессию - капча уже новая.
Не в курсе случайно что за это отвечает?

в мане что-то ничего не сказано... http://www.yiiframework.com/doc/api/1.1/CCaptcha

У Вас смотрю математика обновляется.. гм..
Спасибо за хороший ресурс по Yii! Многому у Вас научился!

[guest] zolter

Было сказано: Четверг, 16 Май 2013

Там есть параметр который отвечает через сколько перезагрузок страницы капча изменится. http://www.yiiframework.com/doc/api/1.1/CCaptchaAction#testLimit-detail

[guest] Алекс

Было сказано: Четверг, 16 Май 2013

Спасибо за оперативный ответ.
testLimit - влияет на изменение капчи при неправильном ее вводе. Т.е. через сколько попыток неправильного ввода изображение капчи будет обновлено.
Т.е. этот параметр на рефреш страницы не влияет.

Плиз можете глянуть как у Вас все-таки сделано? ..у Вас стандартная же Yii капча + математика, верно?
..я уже намаялся с капчей %)

[guest] Гость

Было сказано: Четверг, 16 Май 2013

в контроллере перед тем как отправлять на рендеринг страницу, делаем:
$this->createAction('captcha')->getVerifyCode(True);

..другого решения пока не нашлось. У Вас так? )

[guest] zolter

Было сказано: Пятница, 17 Май 2013

Нет, ок завтра постараюсь глянуть и всопмнить

[guest] Гость

Было сказано: Пятница, 17 Май 2013

Спасибо! (меня просто бот какой-то атакует.. панически приходится разбираться... капча стояла дефолтовая на белом фоне, цифри от 3до4 символов - почти без промаху распознает зараза..) сейчас поставил математику по Вашему методу, позже отпишу чего получается..

[guest] Алекс

Было сказано: Воскресенье, 19 Май 2013

Как и обещал - отписываюсь.. Бот по статистике из 5 каптч 4 распознает. Все с 1-ой попытки...
правда два дня помучал сайт и ушел куда-то.

Оставить комментарий


Код:
Имя: