Zend изменяет поведение ошибки проверки: перенос элемента в другой тег

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

Это разметка обычной формы, которую генерирует zend_form:

<dt id="email-label"><label class="required" for="email">Email</label></dt>
<dd id="email-element">
   <input type="text" value="" id="email" name="email">
</dd>

Если проверка не удалась, zend_form добавляет новый ul class="errors" внутри dd

<dt id="email-label"><label class="required" for="email">Email</label></dt>
<dd id="email-element">
   <input type="text" value="" id="email" name="email">
   <ul class="errors">
      <li>Value is required and can't be empty</li>
   </ul>
</dd>

Как я могу немного изменить это поведение по умолчанию, чтобы весь dt dd был заключен в один p или something, к которому я могу добавить класс ошибки? Я предполагаю, что мне нужно указать zend_form, как вести себя, когда у элемента есть ошибки.


person jblue    schedule 06.10.2010    source источник


Ответы (1)


Для этого вы можете создать свой собственный декоратор, например:

class My_Decorator_ElementWrapper extends Zend_Form_Decorator_Abstract
{
    public function render($content)
    {
        $class = 'form-element';
        $errors = $this->getElement()->getMessages();
        if (!empty($errors))
            $errors .= ' has-errors';
        return '<div class="'.$class.'">' . $content . '</div>';
    }
}

Теперь вы можете просто зарегистрировать этот декоратор для элемента:

$element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
$element->addDecorator('ElementWrapper');

Вы также можете зарегистрировать префиксный путь для всех элементов одновременно, используя вместо этого $form->addElementPrefixPath().

Если вы хотите добавить этот декоратор (и путь префикса) автоматически для всех элементов, я предлагаю вам расширить каждый элемент, соответствующий Zend (например, make My_Form_Element_Text, который расширяет Zend_Form_Element_Text), а затем добавить путь префикса в функцию инициализации и override loadDefaultDecorators(), чтобы добавить ElementWrapper в конец цепочки декораторов. Например, так loadDefaultDecorators() ищет Zend_Form_Element_Text:

public function loadDefaultDecorators()
{
    if ($this->loadDefaultDecoratorsIsDisabled()) {
        return $this;
    }

    $decorators = $this->getDecorators();
    if (empty($decorators)) {
        $this->addDecorator('ViewHelper')
            ->addDecorator('Errors')
            ->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
            ->addDecorator('HtmlTag', array('tag' => 'dd',
                                            'id'  => $this->getName() . '-element'))
            ->addDecorator('Label', array('tag' => 'dt'));
    }
    return $this;
}

Вы просто добавляете ->addDecorator('ElementWrapper') в конце цепочки. Итак, чтобы показать конкретный пример My_Form_Element_Text:

class My_Form_Element_Text extends Zend_Form_Element_Text
{
    public function init()
    {
        $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
    }

    public function loadDefaultDecorators()
    {
        if ($this->loadDefaultDecoratorsIsDisabled()) {
            return $this;
        }

        $decorators = $this->getDecorators();
        if (empty($decorators)) {
            $this->addDecorator('ViewHelper')
                ->addDecorator('Errors')
                ->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
                ->addDecorator('HtmlTag', array('tag' => 'dd',
                                                'id'  => $this->getName() . '-element'))
                ->addDecorator('Label', array('tag' => 'dt'))
                ->addDecorator('ElementWrapper');
        }
        return $this;
    }
}
person reko_t    schedule 06.10.2010