DbHelp.ru
Маленький Yii блог
Комментарии
Гость: wh0cd1144039 [url=http://buy-prednisolone.reisen]buy prednisolone[/url] buy prednisolone 5mg without...
Гость: write my essay for me write an essay write essay my essay writing
Гость: wh0cd660443 [url=http://buy-celebrex.reisen]buy celebrex[/url] how much is celebrex http://buy-celeb...
Гость: wh0cd1144039 [url=http://buyadvair.store]advair[/url] advair http://buyadvair.store [url=http://buy-...
Гость: wh0cd660443 [url=http://buyprozac.shop]buy prozac online uk[/url] buy prozac online http://buyprozac...



Сервер 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. Последние пару дней я проводил небольшие технические работы на блоге, но всё не было времени запостить тему про всё что ... "Обновление на DbHelp.ru"

  2. Рамки MVC весьма размыты, поэтому моё понимание может не совпадать с полученными вами ранее знаниями. Хотел бы напомнить что ... "Шаг 3 : Что такое MVC?"

  3. Я тут маленько проспал выход новой версии своего любимого фреймворка. И так, говорим здравствуй Yii 1.1.5! next Самое вкусное: CTypedMap. В профайлере теперь видно ... "Yii Framework 1.1.5"

[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-ой попытки...
правда два дня помучал сайт и ушел куда-то.

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


Код:
Имя: