2012-01-24 6 views
5

En mi aplicación actual, me gustaría colorear las opciones de selección en rojo cuando contienen información incorrecta (es decir, no validada). Cuando un elemento de formulario contiene uno o más errores, debe tener una clase de error (para que yo pueda darle el estilo correspondiente). Intenté recorrer los elementos y ver si validados, pero esto se pone muy feo muy rápidamente.Zend_Form_Element: agregar clase si contiene errores

¿Cómo podría hacerlo mejor?

Gracias

Editar: Esta es mi solución actual (y hace el trabajo, pero dirtily)

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

Respuesta

5

Aquí hay un par de pensamientos ...

  1. lugar de llamar a isValid en cada elemento de formulario, puede validar su formulario completo con isValid y luego recorrer sus elementos como lo hace en su pregunta, pero en su lugar use if ($element->hasErrors()) para determinar si Necesitas agregar la clase de error al elemento.

  2. Es posible que desee extender desde Zend_Form y agregar un método de ayuda a su nueva clase de formulario que hace esto por usted. Por ejemplo, agregue un método llamado highlightErrorElements() o algo así y si tiene una llamada incorrecta al $form->isValid(), puede simplemente llamar al $form->highlightErrorElements() que recorrerá cada elemento del formulario y verá si tiene errores y aplicará el estilo si es necesario.

Ejemplo:

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

En algún lugar, en un controlador ...

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