Zend изменяет поведение ошибки валидации: оборачивает элемент в другой тег - PullRequest
1 голос
/ 07 октября 2010

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

Это разметка обычной формы, которую генерирует 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, как вести себя, когда элемент имеет ошибки.

1 Ответ

5 голосов
/ 07 октября 2010

Вы можете создать свой собственный декоратор, чтобы сделать это, что-то простое, как это ::

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), а затем добавьте путь префикса в функцию init и переопределите метод 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;
    }
}
...