Я как раз собирался задать этот вопрос сам со своим собственным решением, чтобы обеспечить сообщество, так сказать, когда увидел, что ваш вопрос всплывает в предложениях.
Мое простое и довольно элегантное решение, если я так говорю, использует простой пользовательский декоратор. Он ничего не делает с контентом, который получает, но изменяет элемент.
class App_Form_Decorator_ErrorClass
extends Zend_Form_Decorator_Abstract
{
protected $_placement = null;
protected $_options = array(
'class' => 'error'
);
public function render( $content )
{
$element = $this->getElement();
if( $element->hasErrors() )
{
$errorClass = $this->getOption( 'class' );
$currentClass = $element->getAttrib( 'class' );
$element->setAttrib( 'class', ( !empty( $currentClass ) ? $currentClass . ' ' . $errorClass : $errorClass ) );
}
return $content;
}
}
Использование:
Все, что вам нужно сделать, это добавить декоратор перед декоратором ViewHelper и ваш набор.
public function init()
{
$elementDecorators = array(
'ErrorClass',
'ViewHelper',
// etc..
);
// or:
$elementDecorators = array(
array(
'ErrorClass',
array( 'class' => 'custom-class' ) // defaults to 'error'
),
'ViewHelper',
// etc..
);
// then just add the decorators to an element the way you usually do, for instance like so:
$someElement = new Zend_Form_Element_Text( 'someElement' );
$someElement->setDecorators( $elementDecorators );
// etc...
O, PS .: Обязательно добавьте правильный путь префикса в вашей форме:
$this->addPrefixPath( 'App_Form', 'App/Form' ); // or your own namespace