DbHelp.ru
Маленький Yii блог
Комментарии
zolter: Спасибо за хороший отзыв. Постараюсь уделять на статьи больше времени, особенно на обучающие...
den: Ух ты! между этой статьёй и прошлой год разницы. Я как-то прочитал все статьи одним махом и теперь п...
ATI: Хорошее решение для нотисов в админке. Спасибо автору.
wlnner: Не забыл. Есть.
wlnner: Не забыл. Есть.


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

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

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

Рейтинг: 0.00 (0)
30 Апр. 2009

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. Поздравляю всех с выходом Yii Framework 1.1 beta next Список изменений Загрузить версию 1.1 beta ... "Yii PHP framework 1.1 beta"

  2. Разговор сегодня пойдет про SwiftMailer. Это удобный инструмент для отправки почты из php скрипта. Вы сможете:   очень легко и ... "Подключаем SwiftMailer к Yii"

  3. Заказали мне в общем сделать на сайте элемент, который информировал бы о кол-ве людей на сайте. Некий счетчик живого онлайна. ... "Хитрый счетчик "онлайна на сайте""

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

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


Код:
Имя: