DbHelp.ru
Маленький Yii блог
Комментарии
Андрей: Добрый день, а что делать если таблица связочная с 2-мя ...
Гость: Шел 2014 год, пятый год от начала обещаний...
Гость: Ощущение, что из практиков здесь нет никого, все сразу ...
Slavik: Нигде не вижу ответа на такой вопрос Как сделать что-б...
Denis: Полностью рабочий код для Yii 1.1.15 можете найти на https://gith...



Сервер 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. Ох много времени я потратил на настройку своего блога на новом хостинге. Получилось так что я взял вдс с isp ... "Проблемы с ЧПУ yii + isp"

  2. Как часто в проектах вы сталкиваетесь с загрузкой картинок? Если в своей работе вы используете thumb-pics (уменьшенные картинки) — тогда ... "Обзор дополнения EasyPhpThumb"

  3. Это руководство предназначено для более-менее продвинутых пользователей. Если вы только что начали работу с Yii Framework-ом, вам стоит вернутся ... "Многоязычность субдоменов и URL-правила"

[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 решила мою проблему :)

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


Код:
Имя: