zend_form 之定制表单元素

23.3.9.  定制元素

通过继承 Zend_Form_Element 类,你可以生成自己的定制元素,这样做的原因是:

  • 共享通用的校验器和/或过滤器的元素
  • 有定制装饰器功能的元素

有两个方法一般用来扩展元素:init() 可为元素添加定制的初始化逻辑;loadDefaultDecorators() 可用于设置一个用于元素的缺省装饰器的列表。

用例子来说明,你在一个表单里生成的所有文本元素需要用 StringTrim 来过滤、用通用的规则表达式来校验,并且你想用你生成的定制的装饰器来显示它们,’My_Decorator_TextItem’。另外,你有许多想指定的标准属性,包括 ‘size’、 ‘maxLength’ 和 ‘class’。你可以定义这样的元素如下:

<?php
class My_Element_Text extends Zend_Form_Element
{
    public function init()
    {
        $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator')
             ->addFilters('StringTrim')
             ->addValidator('Regex', false, array('/^[a-z0-9]{6,}$/i'))
             ->addDecorator('TextItem')
             ->setAttrib('size', 30)
             ->setAttrib('maxLength', 45)
             ->setAttrib('class', 'text');
    }
}
?>

你接着可以通知表单对象关于元素的前缀路径并开始生成元素:

<?php
$form->addPrefixPath('My_Element', 'My/Element/', 'element')
     ->addElement('foo', 'text');
?>

‘foo’ 元素现在是 My_Element_Text 类型并展示你描画的行为。

当继承 Zend_Form_Element 时你想 override 的另一个特殊方法是 loadDefaultDecorators()。这个方法有条件地为你的元素加载一组缺省装饰器,你可能想在你的继承类里替换你自己的装饰器。

<?php
class My_Element_Text extends Zend_Form_Element
{
    public function loadDefaultDecorators()
    {
        $this->addDecorator('ViewHelper')
             ->addDecorator('DisplayError')
             ->addDecorator('Label')
             ->addDecorator('HtmlTag', array('tag' => 'div', 'class' => 'element'));
    }
}
?>

有许多办法定制元素。别忘了阅读 Zend_Form_Element API 文档来获知所有的可用方法。