如何检查Zend_Form_Elements是否没有设置装饰器

时间:2010-12-24 14:15:46

标签: zend-framework zend-form decorator

我发现即使我只声明一个像

这样的元素
$this->addElement('textarea', 'txt1');

我发现它已经设置了装饰器

Zend_Debug::dump($this->getElement('txt1')->getDecorators());

http://pastebin.com/7Y24g62w

我想测试我没有使用setDecorators()或使用类似

的东西设置装饰器
$this->addElement('textarea', 'txt1', array(
    'decorators' => array(...)
));

如果我没有设置任何装饰器然后应用默认装饰器,我该怎么做。我想在每个元素的基础上应用默认装饰器,而不是使用Zend_Form#setDisableLoadDefaultDecoraotrs()

1 个答案:

答案 0 :(得分:1)

有两种选择,具体取决于您希望确定装饰器未被更改的确切程度。

没有选项的装饰者

如果您只想知道是否设置了所有默认装饰器,而不考虑每个装饰器的选项,则可以使用此选项。当然你可以改变默认装饰器的选项,这种方法不会识别这个(但它比广泛的检查更快)。不幸的是,默认装饰器在Zend_Form_Element Zend_Form_Element::loadDefaultDecorators()处进行了硬编码,因此您需要复制该列表。在将来发布链变化时,您需要更改代码。

<?php
$default    = array(
    'Zend_Form_Decorator_ViewHelper',
    'Zend_Form_Decorator_Errors',
    'Zend_Form_Decorator_Description',
    'Zend_Form_Decorator_HtmlTag',
    'Zend_Form_Decorator_Label',
);
$decorators = array_keys($element->getDecorators());
if ($decorators === $default) {
    // They are the same
}

使用所有选项检查装饰器

在这里,您可以创建元素的副本,并在此副本中重新加载所有默认装饰器。它们再次被实例化,因此需要更多资源,但也会检查装饰器的所有选项。

$clone = clone $element;
$clone->clearDecorators()
      ->setDisableLoadDefaultDecorators(false)
      ->loadDefaultDecorators();
if ($clone === $element) {
    // They are the same
}