Математическая капча
Рубрика: Работаем с капчей (captcha)
30 Апр. 2009 Думаю стоит назвать сегодняшний день - Днем Капчи :) В принципе уверен найдется много любителей поизвращяться и превратить капчу на сайте в целое математические выражение типа "сколько будет 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 капче выводить цифры") тогда просто удалите всё что у него внутри и вставьте тот код который я написал выше.
Теперь давайте разберемся в самом коде:
- Я переопределил метод renderImage() наследуемого класса что бы добавить перед ним обработку $code своей функцией
- Создал метод showCode() который принимает в себя числовой код и разбивает его на математическое выражение
- Максимально упростил метод 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 Framework 1.1 beta
next
Список изменений
Загрузить версию 1.1 beta
... "Yii PHP framework 1.1 beta"
- Разговор сегодня пойдет про SwiftMailer. Это удобный инструмент для отправки почты из php скрипта. Вы сможете:
очень легко и ... "Подключаем SwiftMailer к Yii"
- Заказали мне в общем сделать на сайте элемент, который информировал бы о кол-ве людей на сайте. Некий счетчик живого онлайна. ... "Хитрый счетчик "онлайна на сайте""

[guest] Гость
Было сказано: Пятница, 11 Декабрь 2009
заметил глюк у капчи. Ее значение всегда равно шести

[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] Гость
Было сказано: Воскресенье, 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 :)