2012-01-24 14 views
5

Nella mia attuale applicazione, desidero colorare le opzioni di selezione in rosso quando contengono informazioni errate (ovvero non convalidate). Quando un elemento del modulo contiene uno o più errori, dovrebbe avere una classe di errore (quindi è possibile impostare lo stile di conseguenza). Ho provato a scorrere tra gli elementi e vedere se hanno convalidato, ma questo diventa molto brutto molto rapidamente.Zend_Form_Element: aggiungi classe se contiene errori

Come posso ottenere questo risultato in un modo migliore?

Grazie

Edit: Questa è la mia soluzione corrente (e ottiene il lavoro fatto, ma dirtily)

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

risposta

5

Qui ci sono un paio di pensieri ...

  1. Invece di chiamata è valida su ogni elemento del modulo, è possibile convalidare l'intero modulo con isValid e quindi eseguire il loop sui propri elementi come nella domanda, ma utilizzare invece if ($element->hasErrors()) per determinare se si È necessario aggiungere la classe di errore all'elemento.

  2. Si consiglia di estendere da Zend_Form e aggiungere un metodo di supporto alla nuova classe Form che fa questo per voi. Ad esempio, aggiungi un metodo chiamato highlightErrorElements() o qualcosa del genere e se hai una chiamata non riuscita a $form->isValid(), puoi semplicemente chiamare $form->highlightErrorElements() che eseguirà il loop su ogni elemento del modulo e vedrà se ha errori e applicherà lo stile se necessario.

Esempio:

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

qualche parte, in un controllore ...

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