В этой статье рассмотрим как поставить модуль каптчи на кохана фреймворк. Для начала нам понадобится модуль Captcha, его можно скачать с Github, но для Kohana 3.3 его нужно немного доработать.
Подготовка
Сначала скачиваем модуль и распаковываем в папку modules/captcha. Далее нужно в файле modules/captcha/classes/captcha.php заменить старый вариант вызова request:
Request::instance()->headers['Content-Type'] = 'image/'.$this->image_type; Request::instance()->headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'; Request::instance()->headers['Pragma'] = 'no-cache'; Request::instance()->headers['Connection'] = 'close';
на новый:
Request::current()->headers('Content-Type', 'image/'.$this->image_type); Request::current()->headers('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); Request::current()->headers('Pragma', 'no-cache'); Request::current()->headers('Connection', 'close');
Подключаем модуль в bootstrap.php:
Kohana::modules(array( // 'auth' => MODPATH.'auth', // Basic authentication // 'cache' => MODPATH.'cache', // Caching with multiple backends // 'codebench' => MODPATH.'codebench', // Benchmarking tool 'database' => MODPATH.'database', // Database access 'image' => MODPATH.'image', // Image manipulation 'captcha' => MODPATH.'captcha', // Captcha // 'minion' => MODPATH.'minion', // CLI Tasks // 'orm' => MODPATH.'orm', // Object Relationship Mapping // 'unittest' => MODPATH.'unittest', // Unit testing // 'userguide' => MODPATH.'userguide', // User guide and API documentation ));
Controller
Создадим контролер Home.php в котором будем генерировать каптчу и проверять ее на валидность:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Home extends Controller_Template { public $template = "main"; public function action_index() { if($post = $this->request->post()){ /** Проверяем Каптчу на валидацию */ if(Captcha::valid($post['captcha'])){ // записываем данные в БД, например } } $captcha_image = Captcha::instance()->render(); // выводим наш шаблон $this->template->content = View::factory('home')->bind('captcha_image', $captcha_image); } }
Views
Далее создаем шаблон home.php с некой формой и каптчей:
<?=Form::open()?> <div class="form-item"> <label>Введите имя:</label> <?=Form::input('name')?> </div> <div class="form-item"> <label>Введите код указанный на картинке:</label> <?=Form::input('captcha')?> <?=$captcha_image?> <img alt="Обновить код" src="/images/refresh.png" class="refresh" title="Обновить код" /> </div> <div class="form-item"> <?=Form::submit('submit', 'Отправить',array('class'=>'btn btn-primary'))?> </div> <?=Form::close()?>
jQuery
Для организации смены плохо читаемой картинки на более читаемую, воспользуемся вспомогательным элементом, который будет обновлять изображение посредством jQuery:
$(".refresh").on('click',function(){ // Добавляем событие на изображение "обновить" при нажатии /** Картинке с кодом присваиваем новое изображение * Math.random() нам нужно для того чтобы не было кеширование картинок */ $("img.captcha").attr("src","/captcha/default?_rnd="+Math.random()); return false; });
На этом все, будут вопросы - пишите.