Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

понедельник, 23 августа 2010 г.

Zend Framework. Создание собственного элемента формы Zend_Form

Версия ZF: 1.10.
Создание собственного элемента формы 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
{
public function securimage($name, $value = null, $attribs = null)
{
$html = "<img src='http://path/to/captcha' />";
$html .= "<input type='text' name='{$name}' />";
return $html;
}
}
?>
Одноименный метод хелпера возвращает 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);

// ....
}
}
Пути к файлам элемента и валидатора указывать не требуется, все включается автоматически.
Если нет, то возможно потребуется явно подключить все необходимые файлы.

Комментариев нет:

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