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 капчей и этого хватило для того, чтобы я перестал видеть спам в админке этого сайта.




Добавлена: 23-03-2009 | Изменена: 21-04-2009 | Пользователем: djaarf | Просмотров: 2636


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



Капча *

Captcha

Комментарий будет опубликован после проверки модератором

Для подсветки синтаксиса исходный код следует обрамлять следующими тэгами
<pre><code class="синтаксис" >код</code></pre>
Подерживаются следующие: cpp php javascript sql html-xml css ini