Вы можете создать собственный декоратор.
App_Form_Decorator_AdditionalError
extends Zend_Form_Decorator_Abstract
{
protected $_options = array(
'additionalError' => 'ERROR'
);
public function render( $content )
{
$element = $this->getElement();
if( $element->isErrors() )
{
$element->addError( $this->getOption( 'additionalError' ) );
}
return $content;
}
}
Но это только добавит дополнительную ошибку в стек ошибок.Вы могли бы получить больше фантазии, фактически добавив или добавив ошибку к $content
вместо простого добавления ее с addError()
.(И, возможно, расширить декоратор HtmlTag
вместо декоратора Abstract
).Но я ленив, чтобы сделать полный пример этого прямо сейчас.Сожалею.Может быть, я вернусь к этому завтра.Надеюсь, что это помогает / вдохновляет вас.
Кстати;использование вышеупомянутого будет:
$this->setDecorators(array(
array(
'AdditionalError',
array( 'additionalError' => 'Some additional error message' )
)
'FormErrors',
// etc.
Редактировать:
Хорошо, поэтому я хорошо выспался ночью, и вот лучшее предложение.Он расширяет Desciption
, чтобы использовать преимущества уже определенных опций, таких как tag
, escape
и т. Д. Он даже переводим (ууу! :)).И этот добавляет опцию setError
и переопределяет метод render
. Это не проверено, поэтому вы можете получить некоторые ошибки и / или синтаксические ошибки.
class App_Form_Decorator_AdditionalError
extends Zend_Form_Decorator_Description
{
protected $_error = 'error';
public function setError( $error )
{
$this->_error = (string) $error;
return $this;
}
public function getError()
{
if( null !== ( $error = $this->getOption( 'error' ) ) )
{
$this->setError( $error );
$this->removeOption( 'error' );
}
return $this->_error;
}
public function render( $content )
{
$element = $this->getElement();
$view = $element->getView();
if( !$element->isErrors() || null === $view )
{
return $content;
}
$error = $this->getError();
$error = trim( $error );
if( !empty( $error ) && ( null !== ( $translator = $element->getTranslator() ) ) )
{
$error = $translator->translate( $error );
}
if( empty( $error ) )
{
return $content;
}
$separator = $this->getSeparator();
$placement = $this->getPlacement();
$tag = $this->getTag();
$class = $this->getClass();
$escape = $this->getEscape();
$options = $this->getOptions();
if( $escape )
{
$error = $view->escape( $error );
}
if( !empty( $tag ) )
{
require_once 'Zend/Form/Decorator/HtmlTag.php';
$options[ 'tag' ] = $tag;
$decorator = new Zend_Form_Decorator_HtmlTag( $options );
$error = $decorator->render( $error );
}
switch( $placement )
{
case self::PREPEND:
return $error . $separator . $content;
case self::APPEND:
default:
return $content . $separator . $error;
}
}
}
Использование:
public function init()
{
$this->addPrefixPath( 'App_Form', 'App/Form' ); // or any other namespace you will use
$this->setDecorators( array(
'FormErrors',
'FormElements',
array(
'AdditionalError',
array( 'error' => 'You messed up! :)', 'placement' => 'prepend', 'tag' => 'div', 'class' => 'additional-error' )
),
array(
'HtmlTag',
array( 'tag' => 'dl', 'class' => 'zend_form' )
),
'Form'
) );
}
Редактировать 2:
Я проверил это сейчас и удалил синтаксические ошибки и ошибки.Кажется, теперь работает как ожидалось.