我发现即使我只声明一个像
这样的元素$this->addElement('textarea', 'txt1');
我发现它已经设置了装饰器
Zend_Debug::dump($this->getElement('txt1')->getDecorators());
我想测试我没有使用setDecorators()或使用类似
的东西设置装饰器$this->addElement('textarea', 'txt1', array(
'decorators' => array(...)
));
如果我没有设置任何装饰器然后应用默认装饰器,我该怎么做。我想在每个元素的基础上应用默认装饰器,而不是使用Zend_Form#setDisableLoadDefaultDecoraotrs()
答案 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
}