如何将装饰器应用为Zend_Form中所有表单的默认值?

时间:2012-01-18 10:29:10

标签: zend-framework zend-form

我需要在我的表单中显示表单级错误(不属于一个字段的错误,但是整个表单提交错误),使用以下代码:

$form->addError($message);

为此,我需要将相关的装饰器添加到我的表单中:

$form->addDecorator('Errors');

相当容易。问题是应用新的装饰器会导致删除所有默认装饰器,从而迫使我重新应用所有装饰器:

$form->addDecorator('Errors')
     ->addDecorator('FormElements')
     ->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form'))
     ->addDecorator('Form');

这是我的大多数表单中的一些冗余代码。是否可以通过应用某些设置来使Errors装饰器成为默认装饰器的一部分?

我显然可以创建一个继承的Form类,但我想知道我是否缺少一个更简单或更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以覆盖loadDefaultDecorators方法以创建支持以下错误的表单类:

/**
* Form with error decorator included by default 
*/
class ErrorForm extends Zend_Form {

   public function loadDefaultDecorators() {
       $this->addDecorator('Errors');
       $decoratorsWithError = $this->getDecorators();

       //clearing to let the parent do default business
       $this->clearDecorators();
       parent::loadDefaultDecorators();

       //union decorators array so error is first
       $finalDecorators = $decoratorsWithError + $this->getDecorators();

       //finally
       $this->setDecorators($finalDecorators);
       return $this;
    }

}

错误装饰器应该是第一个渲染的装饰器。 我认为更优雅的解决方案需要Zend_Form重构。