2009-08-06 8 views
9

Estoy construyendo una aplicación ZendFramework que como formulario de inicio de sesión solicita una dirección de correo electrónico y una contraseña. Parecía lógico validar la dirección de correo electrónico antes de llegar a la base de datos con el intento de inicio de sesión, ya que un correo electrónico no válido nunca daría lugar golpear. Zend_Validate_EmailAddress parecía ser el camino correcto, pero estoy teniendo un problema generando varios errores (pregunta al pie, después del código).En Zend_Form, ¿cómo evitar que Zend_Validate_Email genere múltiples errores?

Mi forma tiene actualmente la siguiente

//WPMail_Form_Login::init() 
$email = $this->addElement('text', 'email', array(
    'label'=>'Email', 
    'required'=>true, 
    'filters'=>array('stringtrim'), 
    'validators'=>array(array('emailaddress', true, array(
     'messages'=>array(
      'emailAddressInvalidHostname'=>'Your email address is invalid', 
      'emailAddressInvalidFormat'=>'Your email address is invalid', 
      '...'=>'(repeat for all message templates)' 
     ) 
    ))), 
)); 

En el controlador que pase directamente el formulario en la vista:

// WPMail_AuthController::loginAction() 
$this->view->form = $form; 

Y en la vista, que está directamente echo'd:

// views/scripts/auth/login.phtml 
<?php echo $this->form ?> 

El resultado es actualmente algo como esto:

- Your email address is invalid 
- 'asda!!!' does not match the expected structure for a DNS hostname 
- 'asda!!!' does not appear to be a valid local network name 

Lo que deseo saber es: ¿Es posible configurar Zend _ Validar _ EmailAddress de tal forma que solo produzca un solo error de correo electrónico no válido? Con "configurar" quiero decir, sin extender la clase y anular la lógica con la mía.

TIA.

Respuesta

10

Zend Form Element tiene varios métodos que puede utilizar para personalizar los mensajes. No está muy claro en los documentos, pero addErrorMessage() establece un solo mensaje de error personalizado en la validación fallida. Por lo tanto,

Su ejemplo se vería así:

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email') 
     ->setRequired(true) 
     ->addFilter('stringtrim') 
     ->addValidator('emailAddress', true) 
     ->addErrorMessage('Your email address is invalid'); 
$this->addElement($email); 

Ver http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.validators.errors

+0

Maravilloso, gracias! De hecho, me encontré con eso, pero de alguna manera asumí que agregar un mensaje de error invalidaría el formulario (como en eso es parte de cuando haces tu propia validación) ... ¡me alegra ver que es así de simple! – kander

+2

Puede ser confuso ... $ email-> addError ($ mensaje) establecerá un error y marcará como no válido, pero $ email-> addErrorMessage ($ message) simplemente aparece para configurar el mensaje, que anula los predeterminados, y doesn ha configurado un error! – simonrjones

+0

+1, gracias por el consejo de conocimiento – Ish

1

Como esos mensajes son generados por uno validador, no creo que es posible :-(

El método Zend_Validate_EmailAddress::isValid hace todas las validaciones, en genera los errores en su conjunto, lo que parece.

Una solución "hacky" sería repetir, en su controlador, los errores y eliminar todos menos el primero, para cada campo que tenga más de uno ... Pero realmente no me gusta el sonido de eso ...


Se podría, por supuesto, y heredar que modificar el comportamiento por defecto ... Pero declarado que no quería hacer eso, así que ...


Sin embargo, si estoy equivocado, y hay una manera, estoy muy curioso al respecto ;-)

+1

En realidad, los mensajes fueron generados por dos validadores!Zend_Validate_Hostname fue llamado indirectamente por Zend_Validate_Email. – kander

3

Mira esto tutorial por Pádraic Brady en el uso de Zend_Form.

Específicamente la sección "Paso 4: Manejo de mensajes de error con un decorador personalizado".

+0

¿Quiere decir usar el traductor en el paso 5 Bill? Eso todavía parece requerir múltiples declaraciones de su mensaje predeterminado para cada tipo de error. – simonrjones

+0

No, me refiero al paso 4. Podría escribir un decorador de error personalizado que devuelva el * primer * mensaje del validador de correo electrónico como desee, en lugar de implosionar todos los mensajes. –

+0

¡Buen enlace! Parece que los decoradores personalizados serían otra forma (en comparación con la solución de simonrjones) de conseguir lo que quiero, aunque me recuerda un poco el sketch 'Mosquito Hunting' de Monty Python ... como en, es probable que sea un poco torpe para lograr esto , en comparación con la solución de simonrjones. – kander

Cuestiones relacionadas