Zend_Captcha. Работа с капчей через хелпер.
Не буду выдумывать предисловий о защите форм от спама, наверняка вы здесь не за этим, а перейду сразу к делу. И так, рассмотрим использование адаптера Zend_Captcha_Image.
Что бы избежать раздутости контроллеров, считаю вполне приемлемым вынести генерацию изображения для каптчи в Action Helper т.е. вся работа с компонентом будет спрятана в хэлпере (о создании хелперов действий).
Ниже приведен исходный код хелпера, еще ниже некоторые пояснения, а еще ниже на форме для камментов уже пример (если вы не залогинены).
Mylib/Controller/Action/Helper/Captcha.php
<?php
require_once('Zend/Captcha/Image.php');
require_once('Zend/Session/Namespace.php');
class Mylib_Controller_Action_Helper_Captcha extends Zend_Controller_Action_Helper_Abstract
{
public $id;
public $html;
public $captcha;
public function __construct()
{
$this->captcha = new Zend_Captcha_Image(array(
"imgDir" => WWWPATH.'/img/captcha/',
"imgUrl" => HOST.'/img/captcha/',
"imgAlt" => 'Капча',
"width" => 150,
"height" => 80,
"fsize" => 21,
"font" => APPPATH'/includes/captcha/fonts/DejaVuSerif-Bold.ttf',
"dotNoiseLevel" => 30,
"lineNoiseLevel"=> 3,
"name" => "fillme",
"timeout" => 1800,
"wordlen" => 5
));
}
public function direct($view)
{
$this->generate($view);
}
public function generate($view) {
$this->id = $this->captcha->generate();
$this->html = $this->captcha->render($view);
}
public function isValid($value, $context)
{
return $this->captcha->isValid($value, $context);
}
}
В конструкторе создается объект и помещается в свойство класса, естественно это происходит только один раз при первом вызове хэлпера. Переданные конструктору Zend_Captcha_Image параметры лучше всего вынести в конфиг.
Метод generate() для наглядности, так что его содержимое можно разместить непосредственно в direct().
Использование.
Теперь если в каком-то из действий контроллера требуется отобразить капчу, нужно добавить следующий код в любом месте акшена:
$this->_helper->captcha->generate($this->view);
$this->view->assign("captcha", $this->_helper->captcha->html);
$this->view->assign("captcha_id", $this->_helper->captcha->id);
свойство html содержит тэг <img> с src на сгенерированную картинку.В скрипте вида вызывается очень просто:
<?php echo $this->captcha; ?>
<input type="text" name="fillme[input]" value="" />
<input type="hidden" name="fillme[id]" value="<?php echo $this->captcha_id;?>" />
имя для инпутов мы определили как fillme в конструкторе хелпера.Проверка происходит после отправки формы пользователем, в действии, которое принимает данные:
if (!$this->_helper->captcha->isValid($_POST['fillme'], $_POST)) {
echo 'Капча введена не верно';
}
Это все, что я узнал про работу с ZF капчей и этого хватило для того, чтобы я перестал видеть спам в админке этого сайта.