Как применить декоратор по умолчанию для всех форм в Zend_Form? - PullRequest
1 голос
/ 18 января 2012

Мне нужно отобразить ошибки уровня формы в моих формах (ошибки, которые не относятся к одному полю, но относятся ко всей отправке формы), с этим кодом:

$form->addError($message);

Чтобы это работало,Мне нужно добавить в форму соответствующий декоратор:

$form->addDecorator('Errors');

Довольно просто.Проблема в том, что применение нового декоратора приводит к удалению всех декораторов по умолчанию, что вынуждает меня повторно применять их все:

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

Это некоторый избыточный код, который я имею в большинстве моих форм.Можно ли иметь часть декоратора Errors декораторов по умолчанию, применяя некоторые настройки?

Я мог бы явно создать абстрактный класс Form для наследования, но мне интересно, могу ли яотсутствует простое или более элегантное решение.

1 Ответ

1 голос
/ 20 января 2012

Вы можете переопределить метод 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.

...