Как я могу проверить, что Zend_Form_Elements не имеет декораторов? - PullRequest
1 голос
/ 24 декабря 2010

Я считаю, что даже если я просто объявляю элемент вроде

$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 Ответ

1 голос
/ 26 декабря 2010

Есть два варианта, в зависимости от того, как именно вы хотите убедиться, что декоратор не был изменен.

Декоратор без опции

Если вы просто хотите узнать, установлены ли все декораторы по умолчанию, не думая о параметрах каждого декоратора, вы можете использовать эту опцию. Конечно, вы можете изменить параметры декоратора по умолчанию, и этот метод не распознает это (но это быстрее, чем полная проверка). К сожалению, декораторы по умолчанию жестко закодированы в 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
}
...