Zend_Form超越默认装饰器

时间:2009-12-07 11:28:14

标签: php zend-framework zend-form

我无法使用Zend_Form消除默认的装饰器集。

我试图扩展Zend_Form以实现不同的装饰器样式。

class CRM_Form extends Zend_Form
{
 public function init()
 {  
  $this->setDisableLoadDefaultDecorators(true);

  $this->addDecorator('FormElements')
->addDecorator('Form');

  $this->setElementDecorators(array(
  'ViewHelper',
  'Label',
 'Errors',
   new Zend_Form_Decorator_HtmlTag(array('tag' => 'p'))
  ));
 }
}

当我试图像这样使用这个类时:

$form = new CRM_Form();
$form->setAction('/')->setMethod('post'); 
$id = $form->createElement('text','id')->setLabel('ID:');
$form->addElement($id);

使用旧的装饰器(定义列表)而不是我的段落样式。

如果我在CRM_Form类的init()方法中添加了元素,那么它们就会使用我设置的样式。

如何强制使用该类创建的所有元素使用我的默认样式?

3 个答案:

答案 0 :(得分:1)

当你在init中调用setElementDecorators时,你没有任何要装饰的元素,所以没有任何反应。相反,您可以覆盖Zend_Form :: createElement函数,该函数将执行以下操作:

  1. 如果options数组包含装饰器列表,则只需传递而不做任何更改。
  2. 如果选项没有,则添加默认值。
  3. ...

    // not tested
    public function createElement($type, $name, $options = null)
    {
      if ( !is_array($options) ) {
        $options = array();
      }
      if ( !isset($options['decorators']) ) {
        $options['decorators'] = array(
          'ViewHelper','Label','Errors',
          new Zend_Form_Decorator_HtmlTag(array('tag' => 'p'))
        );
        // I'd make this array a protected class member
      }
    
      return parent::createElement($type, $name, $options);
    }
    

答案 1 :(得分:1)

默认情况下,如果您使用$form->addElement('type', 'name', array('options'=>'example'));格式添加元素,Zend_Form将使用您在setElementDecorators中设置的装饰器。

如果您自己创建元素,然后将它们传递给$form->addElement()函数,则不会自动设置装饰器。

您可以轻松地覆盖该函数,通过在表单中​​执行以下操作来设置已经创建的元素上的装饰器:

public function addElement($element, $name = null, $options = null)
{
  if ($element instanceOf Zend_Form_Element) {
    $element->setDecorators($this->_elementDecortors);
  }
  return parent::addElement($element, $name, $options);
}

答案 2 :(得分:0)

Zend Form正在装饰 后添加元素。因此,创建一个类似“addAndDecorte”的方法:

public function addAndDecorate($element) 
{
   $this->addElement($element);

   // do your decorating stuff..
}