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



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

  2. Привет Всем! Поздравляю Всех с первым днем лета. Не знаю как у вас, но в Одессе с погодой всё ... "Идем на лето!"

  3. Что то подвис я на ошибке "Column name must be either a string or an array." когда пробовал делать update ... "Column name must be either a string or an array"

[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 :)

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


Код:
Имя: