Есть ли простой способ добавить класс ошибок в поля формы с Zend Framework, если проверка не удалась? - PullRequest
0 голосов
/ 23 марта 2011

Пока что я только что узнал, что могу написать собственный помощник вида, но, поскольку я новичок в фреймворке, я не знаю, как это сделать. Я надеюсь, что есть более простой способ!?

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

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

Мое простое и довольно элегантное решение, если я так говорю, использует простой пользовательский декоратор. Он ничего не делает с контентом, который получает, но изменяет элемент.

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
1 голос
/ 23 марта 2011

Да, используйте библиотеку JavaScript Dojo (хотя ее настройка может быть довольно сложной) Попробуйте это, чтобы начать http://techchorus.net/add-cool-zend-dojo-date-picker-form-element-without-writing-single-line-javascript

Вот как это выглядит: enter image description here

0 голосов
/ 15 февраля 2013

Самый простой способ, который я нашел для этого, - это расширение метода isValid () соответствующего используемого класса форм, предпочтительно установленного в класс My_Standard_Form в вашей библиотеке.

public function isValid($data)
{
    $valid = parent::isValid($data);

    foreach ($this->getElements() as $element) {
        if ($element->hasErrors()) {
            $oldClass = $element->getAttrib('class');
            if (!empty($oldClass)) {
                $element->setAttrib('class', $oldClass . ' error');
            } else {
                $element->setAttrib('class', 'error');
            }
        }
    }

    return $valid;
}

Кредиты для решения идутв блог факторов сайта (http://www.websitefactors.co.uk/zend-framework/2011/06/error-class-on-form-field-errors-using-zend-form/).

...