Создание собственного элемента формы Zend_Form довольно тривиально.
Ниже пример для класса Securimage. Собственно в Zend Framework достаточно вариантов капчи на любой вкус, все это лишь для иллюстрации того, как это работает.
Где-то у нас есть объект Zend_View ... Надо указать путь к хелперам (view helpers).
Допустим они у нас в каталоге Custom (по умолчанию Zend_View смотрит Zend/View/Helper/).
Объект вида можно хранить, допустим в реестре, а вообще как хотим.
$view = new Zend_View();
$view->setHelperPath('Custom/View/Helper/', 'Custom_View_Helper_');
файл: Custom/Form/Element/Securimage.php
Собственно и все, просто указали хелпер вида для отображения, в данном случае.
class Custom_Form_Element_Securimage extends Zend_Form_Element
{
public $helper = 'Securimage';
}
Все может быть гораздо сложнее, но нам тут это не нужно.
файл: Custom/View/Helper/Securimage.php
class Custom_View_Helper_Securimage extends Zend_View_Helper_FormElementОдноименный метод хелпера возвращает html-код нашего элемента.
{
public function securimage($name, $value = null, $attribs = null)
{
$html = "<img src='http://path/to/captcha' />";
$html .= "<input type='text' name='{$name}' />";
return $html;
}
}
?>
Это то что мы увидим в результате вызова метода render нашего элемента.
Ну и наконец нам нужен валидатор значения нашего элемента.
Подключение класса Securimage обеспечено автозагрузчиком.
Валидатор наследует класс фреймворка Zend_Validate_Abstract и должен реализовать метод
isValid с определенным списком параметров (это важно, иначе он не будет вызван методом isValid класса Zend_Form).
файл: Custom/Validate/Securimage.php
class Custom_Validate_Securimage extends Zend_Validate_AbstractОсталось совсем немного, создать форму и добавить туда наш элемент, примерно так ...
{
const INVALID = 'invalid';
protected $_messageTemplates = array(
self::INVALID => 'Неверный код'
);
public function isValid($val, $context = null)
{
$val = (string) $val;
$this->_setValue($val);
$si = new Securimage();
if(!$si->check($val)) {
$this->_error(self::INVALID);
return false;
}
return true;
}
}
class MyForm extends Zend_FormПути к файлам элемента и валидатора указывать не требуется, все включается автоматически.
{
pulic function init()
{
// ....
$si = new Custom_Form_Element_Securimage('cap');
$si->addValidator(new Custom_Validate_Securimage());
$si->setRequired();
$si->setLabel('Код');
$this->addElement($si);
// ....
}
}
Если нет, то возможно потребуется явно подключить все необходимые файлы.
Комментариев нет:
Отправить комментарий