Строка ошибки Zend - PullRequest
       6

Строка ошибки Zend

3 голосов
/ 30 марта 2011

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

$this->setDecorators(array(
            'FormErrors',
            'FormElements',
        array('HtmlTag',array('tag' => 'dl','class' => 'zend_form')),
            'Form'
           ));

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

"ARLET ALERT ERROR ERROR" просто одна простая строка каждый раз, когда Zend Errors вызывается

Есть идеи?

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Вы можете создать собственный декоратор.

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:
Я проверил это сейчас и удалил синтаксические ошибки и ошибки.Кажется, теперь работает как ожидалось.

0 голосов
/ 31 марта 2011

Если вы хотите, чтобы ваша строка добавлялась ко всем ошибкам в ZF, вы можете использовать псевдоселектор CSS2 : before со свойством content.Просто укажите целевой элемент ошибок ZF, который AFAIR имеет значение ul.errors:

ul.errors:before {
    content: 'Look, there are errors below!';
}

. Вы также можете указать некоторые ошибки, если передаете правильную опцию декоратору и ссылаетесь на них по классу или идентификатору.

0 голосов
/ 31 марта 2011

В прошлом я использовал декоратор Errors , но применялся к самой форме (а не к типичному использованию в форме element ).

В форме:

$this->setDecorators(
    array(
        'FormElements',
        // whatever other wrapping you need
        // ...
        'Form',
        array('Errors', array('placement' => 'prepend')),

    )
);

В контроллере:

public function someAction()
{
    $form = new My_Form();
    if ($this->getRequest()->isPost()) {
        if ($form->isValid($this->getRequest()->getPost())) {
            // Perform processing on the submitted data
        } else {
            $form->setErrors(array('Note errors below'));
        }
    }
    $this->view->form = $form;
}

В поле зрения

<?= $this->form ?>

Можно убедительно утверждать, что контроллер не должен указывать текст сообщения об ошибке. В этом смысле пользовательский декоратор - как предложено @fireeyedboy - который обнаруживает простое присутствие ошибки в любом из элементов формы и отображает фиксированное (или определяемое конструктором) сообщение об ошибке, вероятно, является более чистым решением. Но описанный выше подход сработал для меня как быстрое, хотя и слегка грязное решение.

Надеюсь, это поможет!

...