2012-01-24 8 views
5

W mojej obecnej aplikacji chciałbym pokolorować wybrane opcje na czerwono, gdy zawierają one błędne informacje (również niepoprawione). Gdy element formularza zawiera jeden lub więcej błędów, powinien mieć klasę błędu (aby odpowiednio ustawić styl). Próbowałem przeglądać elementy i sprawdzać, czy zostały zatwierdzone, ale to bardzo szybko staje się bardzo brzydkie.Zend_Form_Element: dodaj klasę, jeśli zawiera błędy

Jak mógłbym to zrobić w lepszy sposób?

Dzięki

Edit: To jest mój obecny obejście (i dostaje zadanie, ale brudno)

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

Odpowiedz

5

Oto kilka myśli ...

  1. Zamiast wywoływania isValid na każdym elemencie formularza, możesz sprawdzić poprawność całej swojej postaci za pomocą metody isValid, a następnie zapętlić swoje elementy tak jak w pytaniu, ale zamiast tego użyć if ($element->hasErrors()), aby ustalić, czy musisz dodać klasę błędu do elementu.

  2. Możesz chcieć przedłużyć Zend_Form i dodać metodę pomocnika do nowej klasy Form, która robi to za ciebie. Na przykład dodaj metodę o nazwie highlightErrorElements() lub coś podobnego, a jeśli masz nieudane połączenie z $form->isValid(), możesz po prostu wywołać $form->highlightErrorElements(), które będzie pętli nad każdym elementem formularza i zobacz, czy ma błędy i zastosować styl, jeśli to konieczne.

przykład:

<?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'); 
      } 
     } 
    } 
} 

gdzieś w sterowniku ...

$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;