DbHelp.ru
Маленький Yii блог
Комментарии
Гость: комент
Гость: wahaha
zolter: Друпал на Yii? ))
nastia: http://drupal.org/
JB: Да там просто ад)) мне всего 3 значения нужно чтобы выпадало, все равно спасибо)...



Сервер 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. Буквально пару дней назад закончилась вторая Международная конференция "FOSS Sea" в Одессе. Как вы понимаете я являлся одним из ... "FOSS Sea 2009"

  2. Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Добавляем Captcha на страницу"

  3. ... "Art"

[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

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

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


Код:
Имя: