Zend_Form_Element: добавить класс, если он содержит ошибки - PullRequest
5 голосов
/ 24 января 2012

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

Как бы я сделал это лучше?

Спасибо

Редактировать: это мой текущий обходной путь (и выполняет работу, но грязно)

$post = $request->getPost();
foreach ($contactForm->getElements() as $element) {
    if (!$element->isValid($post[$element->getName()])) {
        $element->setAttrib('class', 'error');
    }
}

1 Ответ

5 голосов
/ 24 января 2012

Вот пара мыслей ...

  1. Вместо вызова isValid для каждого элемента формы вы можете проверить всю свою форму с помощью isValid, а затем выполнить цикл по всем своим элементам, как и в своем вопросе, но вместо этого используйте if ($element->hasErrors()), чтобы определить, нужно ли добавлять класс ошибки для элемента.

  2. Вы можете перейти от Zend_Form и добавить вспомогательный метод в новый класс Form, который сделает это за вас. Например, добавьте метод с именем highlightErrorElements() или что-то в этом роде, и, если у вас неудачный вызов $form->isValid(), вы можете просто вызвать $form->highlightErrorElements(), который будет перебирать каждый элемент формы и смотреть, есть ли в нем ошибки, и применять стиль при необходимости.

Пример:

<?php

class Application_Form_Base extends Zend_Form
{
    public function __construct()
    {
        // this is where i normally set up my decorators for the form and elements
        // additionally you can register prefix paths for custom validators, decorators, and elements

        parent::__construct();
        // parent::__construct must be called last because it calls $form->init()
        // and anything after it is not executed
    }

    public function highlightErrorElements()
    {
        foreach($this->getElements() as $element) {
            if($element->hasErrors()) {
                $element->setAttrib('class', 'error');
            }
        }
    }
}

Где-то в контроллере ...

$form = new Application_Form_Register(); // this extends Application_Form_Base
if ($form->isValid($this->getRequest()->getPost())) {
    // add user etc
} else {
    $form->highlightErrorElements();
    // other error logic
}

$this->view->form = $form;
...