DbHelp.ru
Маленький Yii блог
Комментарии
Гость: Колпаки на трубы дымопровода Основное назначение флю...
Гость: Уважаемые партнёры, в честь майских праздников мы зап...
Гость: Drive through Verona on Segway and discover the most beautiful sights it has to offer. On this tour ...
Гость: Майнкрафт город зомби. Сериал рассказывает о компьюте...
Гость: ИНВЕСТИЦИОННАЯ ПРИВЛЕКАТЕЛЬНОСТЬ Инвестиционная пр...



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

Математическая капча

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

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

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

Yii Framework Blog img http://dbhelp.rucapcap Думаю стоит назвать сегодняшний день - Днем Капчи :) В принципе уверен найдется много любителей поизвращяться и превратить капчу на сайте в целое математические выражение типа "сколько будет 2+2". Давайте разберемся как такое сделать на Yii ...

---

Давайте с вами договоримся что вы уже читали статью "Добавляем Captcha на страницу" и понимаете как добавить капчу.

Создадим файлик (потомок CCaptchaAction) который возьмет на себя основную работу. Для этого входим в protected/components/ и создаем MyCCaptchaAction.php:

class MyCCaptchaAction extends CCaptchaAction
{
    public function renderImage($code)
    {
        parent::renderImage($this->showCode($code));
    }
    
    protected function showCode($code) {
        $rand = rand(1, (int)$code-1);
        return (rand(0, 1)) ? (int)$code-$rand."+".(int)$rand : (int)$code+$rand."-".(int)$rand;
    }
    
    protected function generateVerifyCode()
    {
        return rand((int)$this->minLength, (int)$this->maxLength);
    }
}

Если у вас уже есть этот файл (вы создали его когда следовали уроку "Как на Yii капче выводить цифры") тогда просто удалите всё что у него внутри и вставьте тот код который я написал выше.

Теперь давайте разберемся в самом коде:

  1. Я переопределил метод renderImage() наследуемого класса  что бы добавить перед ним обработку $code своей функцией
  2. Создал метод showCode() который принимает в себя числовой код и разбивает его на математическое выражение
  3. Максимально упростил метод generateVerifyCode() что бы он возвращал случайное число от minLength до maxLength

Как мне кажется получилось очень элегантно и красиво. Первый мой подход был - переопределить метод run(), но потом я вспомнил про parent:: и код существенно упростился.

Давайте более подробно разберем мой метод showCode() с комментариями:

    protected function showCode($code) {
        // генерируем число от 1 до $code-1
        // для того чтобы это число потом отнять или приплюсовать к $code
        // поэтому $rand всегда должна быть меньше $code
        $rand = rand(1, (int)$code-1);
        // после этого случайным образом либо отнимаем от $code переменную $rand
        // либо складываем их. Данный тип записи является кратким if
        return (rand(0, 1)) ? (int)$code-$rand."+".(int)$rand : (int)$code+$rand."-".(int)$rand;
    }

Вот и все манипуляции :) Теперь нам просто надо зайти в наш контроллер который отвечает за вывод капчи на экран, найти там метод actions() и заменить:

'class'=>'CCaptchaAction',

на 

'class'=>'MyCCaptchaAction',

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

'maxLength'=> 20,
'minLength'=> 2,

Пользуйтесь :)

П.с. посмотреть как выгоялит капча вы можете по адресу http://dbhelp.ru/post/captcha



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

  1. Вот в отпуске побывал впервые в жизни... а некоторые так за всю жизнь ни разу там и не бывают как ... "Не будите программиста!"

  2. Я очень рад сообщить о выходе новой версии Yii Framework 1.1.7. В этой сборке было включено более 90 новых возможностей, ... "Yii PHP framework 1.1.7 is released"

  3. Наиболее легкий способ обновления содержимого через Ajax, это использование метода partialRender(). Давайте научимся им пользоваться! next     Для этого примера у меня есть ... "Обновление содержимого через AJAX используя renderPartial()"

[adm] zolter

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

Поставил себе на комментарии. Вроде прикольно :)

[guest] Игорь

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

Класная капча! Спасибо за создание блога

[adm] zolter

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

Заходите еще)

[guest] Гость

Было сказано: Пятница, 11 Декабрь 2009

заметил глюк у капчи. Ее значение всегда равно шести

[guest] Гость

Было сказано: Пятница, 11 Декабрь 2009

неа :)

[guest] Гость

Было сказано: Воскресенье, 14 Март 2010

а боты с ней дружат?

[adm] zolter

Было сказано: Среда, 24 Март 2010

Еще не встречал :)

[guest] repon

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

а на простой PHP-сайт как ее кинуть?)
без Yii?
не понял :(

[guest] zolter

Было сказано: Среда, 05 Май 2010

Вот почитайте статью как кинуть на обычный php движок:
http://www.dbhelp.ru/yii-captcha-not-in-yii-site/page/

[guest] Kros

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

на 1.1.x капча также как и 3D не работает(, попробуйте поправить пож

[guest] zolter

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

Странно математическая у меня на 1.1 работала. Сегодня попробую и отпишу

[guest] Ra

Было сказано: Суббота, 10 Июль 2010

А Вас не затруднит обьяснить на официальном примере блога, как вставить эту капчу вместо стандартной. Там капча сделана как виджет.

[guest] Ra

Было сказано: Суббота, 10 Июль 2010

Все, понял, всё элементарно, просто туплю.

[guest] zolter

Было сказано: Суббота, 10 Июль 2010

Я тока начал делать) гуд что получилось

[guest] Гость

Было сказано: Воскресенье, 11 Июль 2010

Извиняюсь) просто надо было подольше подумать. Такой вопрос. Сейчас у нас такой сайт www.tvchelny.ru, я его сделал на Joomla. Хочу перевести его на yii, на тестовом домене joomla.tvchelny.ru поднял переделанный официальный блог.
Я сделал 3 узкие колонки, в 1 - новости, во 2 - избранные статьи. Но нужно чтобы новости, если щелкнуть конкретную новость, выводились уже в 1 широкую колонку. Для этого как я понял надо использовать другой layout/main.php (с двумя колонками). В документации написано так:

Макет применяется неявно при вызове метода render(). По умолчанию, в качестве макета используется представление protected/views/layouts/main.php. Это можно изменить путем установки значений CWebApplication::layout или CController::layout.

Подскажите пожалуйста где это прописывать и как?

[guest] Maxx

Было сказано: Воскресенье, 11 Июль 2010

Это прописывать в том экшине который отвечает за вывод новости

[guest] Ra

Было сказано: Воскресенье, 11 Июль 2010

Спасибо за ответ. Это я кажется понимаю, в примере блога в контроллере SiteController выбирается 1 колонка так: public $layout='column1'; а в контроллере PostController выбирается 2 колонки так: public $layout='column2'. Мне непонятно, какой из контроллеров и их action'ов выбрать для главной страницы. По логике, главную должен отображать SiteController, а новость подробно отображает PostController. И можно ли внутри action'а менять $layout ?

[guest] Гость

Было сказано: Воскресенье, 11 Июль 2010

И ещё вопросик: мне тут в голову пришло, а может новости делать как виджет? Они же очень похожи на тот же вывод последних комментариев.

[guest] Ra

Было сказано: Воскресенье, 11 Июль 2010

Ура, кажется, понял. Спасибо вот этому http://www.yiiframework.com/doc/cookbook/28/ . Просто надо написать public function actionView() { $this->layout='column1'; ... I love Yii :)

[guest] Гость

Было сказано: Пятница, 10 Февраль 2012

Хорошая капча =)

[guest] Александр

Было сказано: Четверг, 16 Февраль 2012

а у меня почему-то не обновляется.. хотя Ajax = true стоит

[guest] RuZzz

Было сказано: Воскресенье, 29 Апрель 2012

Так это получается роботу нужно несколько раз пройтись по всему диапазону значений и он добьется своего

[guest] zolter

Было сказано: Воскресенье, 29 Апрель 2012

Вы не забывайте что капча меняет значение через N не удачных попыток ввода (выставляется в конфиге)

[guest] Гость

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

так я выставил N=1 и получается что роботу надо раз 10 пройтись по диапазону от 1 до 10 и он по любому сделает своё черное дело.

[guest] Гость

Было сказано: Вторник, 19 Июнь 2012

А у этой капчи ответ всегда 6 или 7? Или у меня где-то ошибка?

[guest] Гость

Было сказано: Четверг, 21 Июнь 2012

Подскажите как можно сделать, чтобы при обновлении страницы капча менялась автоматом(как вроде нажали - "получить новый код"). Что надо сделать и где ?

[guest] Гость

Было сказано: Пятница, 22 Июнь 2012

Прописать testlimit в 0:

public function actions()
{
return array(
'captcha'=>array(
'class'=>'MyCCaptchaAction',
'backColor'=>0xFFFFFF,
'testLimit'=> 0,

[guest] Гость

Было сказано: Среда, 13 Февраль 2013

С Yii 1.1.3 не работает.

[guest] nos

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

П.с. посмотреть как >>>выгоялит<<< капча вы можете по адресу

текст поправьте

[guest] vinaletna

Было сказано: Суббота, 22 Февраль 2014

Помогите, если возможно!Сделала каптчу по рецепту. Каптча формируется, но не выводится картинка. Разрешение на экшен стоит, библиотека GD для PHP установлена. Куда бы мне еще покопать?

[guest] vinaletna

Было сказано: Воскресенье, 23 Февраль 2014

Строка ob_clean(); в файле CCaptchaAction.php,
методах renderImageGD и renderImageImagick решила мою проблему :)

[guest] Andrey

Было сказано: Пятница, 14 Август 2015

Добрый день, почему может вываливаться ошибка:

2015/08/14 09:07:45 [error] [php] mt_rand(): max(0) is smaller than min(1) (S:\DEVELOPER\openserver\OpenServer\domains\drive\protected\modules\crud\components\actions\default\MathCaptchaAction.php:26) ?

[guest] Гость

Было сказано: Суббота, 19 Декабрь 2015

У вас код всегда 17.

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


Код:
Имя: