Есть ли лучший способ разработки zend_forms вместо использования декораторов?

В настоящее время я использую zend_decorators для добавления стилей в свою форму. Мне было интересно, есть ли альтернативный способ сделать это? Трудно писать декораторы. Мне бы понравилось случайное использование divs и css-стиля:

<input type="submit" class="colorfulButton" > 

Это намного проще, чем установить декоратор для определенного элемента управления и добавить его. Так как это требует создания декоратора для каждой реализации стиля и добавления его с помощью элемента управления. Посмотрите помощников на трюк?

Есть несколько способов. Вы можете свернуть свои собственные помощники элементов представления элементов (которые, возможно, скоро станут довольно неуклюжими).

Или … вы можете использовать viewcript для формы, как это (очень простой пример):

 class Your_Form extends Zend_Form { public function init() { $this->setDecorators( array( 'PrepareElements', array( 'ViewScript', array( 'viewScript' => 'path/to/viewscript.phtml' ) ) ) ); // only use basic decorators for elements $decorators = array( 'ViewHelper', 'Label', 'Errors' ); // create some element $someElement = new Zend_Form_Element_Text( 'someElement' ); // set the basic decorators for this element and set a css class $someElement->setDecorators( $decorators ) ->setAttrib( 'class', 'someCssClass' ); // add (potentially multiple) elements to this from $this->addElements( array( $someElement ) ); } } 

См. Раздел стандартных декораторов о PrepareElements для того, почему необходимо, чтобы декоратор PrepareElements был установлен для формы при использовании декоратора ViewScript.

Затем в viewcript:

 <? // the form is available to the viewscript as $this->element $form = $this->element; ?> <!-- put whatever html you like in this script and render the basic element decorators seperately --> <div> <? if( $form->someElement->hasErrors() ): ?> <?= $form->someElement->renderErrors() ?> <? endif; ?> <?= $form->someElement->renderLabel(); ?> <?= $form->someElement->renderViewHelper(); ?> </div> 

Если вы просто хотите установить атрибут класса в элементе формы, нет необходимости определять декоратор: это можно сделать, используя некоторые стандартные методы элементов zend_form.

См. setAttrib() в разделе « Метаданные и атрибуты» руководства и пример, приведенный там (цитата) :

 // Equivalent to $element->setAttrib('class', 'text'): $element->class = 'text; 

И если вы можете установить атрибут класса таким образом, вы можете, возможно, установить его при построении элементов своей формы или в .ini-файле, который будет определять эти элементы, – есть пример, который показывает, что чуть позже на странице, в раздел Конфигурация .