2009-08-06 12 views
9

Sto costruendo un'applicazione ZendFramework che come modulo di accesso richiede un indirizzo e-mail e una password: sembrava aver senso convalidare l'indirizzo e-mail prima di colpire il database con il tentativo di accesso, poiché un'e-mail non valida non porterebbe mai a un valido colpire. Zend_Validate_EmailAddress sembrava la strada giusta da percorrere, ma ho riscontrato un problema con la generazione di errori multipli (domanda in basso, dopo il codice).In Zend_Form, come evitare che Zend_Validate_Email generi più errori?

La mia forma attualmente ha il seguente

//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)' 
     ) 
    ))), 
)); 

Nel controllore passo direttamente il modulo nella vista:

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

E in vista, è direttamente echo'd:

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

Il risultato è attualmente simile al seguente:

Quello che voglio sapere è: È possibile configurare Zend _ Convalidare l'indirizzo Email _ in modo tale da produrre solo un singolo errore e-mail non valido? Con "configure" intendo, senza estendere la classe e ignorando la logica con la mia.

TIA.

risposta

10

L'elemento Modulo Zend ha vari metodi che è possibile utilizzare per personalizzare i messaggi. Non è molto chiaro dai documenti, ma addErrorMessage() imposta un singolo messaggio di errore personalizzato sulla convalida non riuscita.

Il tuo esempio sarebbe quindi simile:

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

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

+0

Meraviglioso, grazie! In realtà mi sono imbattuto in questo, ma in qualche modo ho pensato che l'aggiunta di un messaggio di errore avrebbe invalidato il modulo (come nel fatto che è parte di quando si esegue la propria validazione) .. felice di vedere che è così semplice! – kander

+2

Si può diventare confuso .. $ basata su posta elettronica> addError ($ message) fisserà un errore e contrassegnare come non valida, ma basata su posta elettronica $> addErrorMessage ($ message) appare solo per impostare il messaggio, che ignora quelli di default, e doesn 'impostare un errore! – simonrjones

+0

+1, grazie per il consiglio di conoscenza – Ish

1

Come quei messaggi sono generati da una validatore, non credo sia possibile :-(

Il metodo Zend_Validate_EmailAddress::isValid fa tutte le convalide, sui genera gli errori nel suo complesso, a quanto pare.

Una soluzione "hacky" sarebbe quella di iterare, nel controller, sugli errori e rimuovere tutti tranne il primo, per ogni campo che ne ha più di uno ... Ma il suono non mi piace molto di quello ...


Si potrebbe, ovviamente, eredita rispetto e modificare il comportamento predefinito ... Ma lei ha dichiarato che non volevi farlo, quindi ...


Eppure, se mi sbaglio, e c'è un modo, ne sono molto curioso ;-)

+1

In realtà, i messaggi sono stati generati da due validatori!Zend_Validate_Hostname veniva chiamato indirettamente da Zend_Validate_Email. – kander

3

Dai un'occhiata a questo tutorial di Pádraic Brady su Zend_Form.

In particolare la sezione "Passaggio 4: gestione dei messaggi di errore con un decoratore personalizzato".

+0

Intendi dire che usi il traduttore al punto 5 Bill? Questo sembra richiedere più dichiarazioni del tuo messaggio predefinito per ogni tipo di errore. – simonrjones

+0

No, intendo il punto 4. Potresti scrivere un decoratore di errori personalizzato che restituisca il * primo * messaggio dal validatore dell'e-mail come desideri, invece di implodere tutti i messaggi. –

+0

Ottimo link! Sembra decoratori personalizzati sarebbe un altro modo (rispetto al simonrjones' soluzione) per ottenere ciò che voglio, anche se mi ricorda un pò di Monty Python 'schizzo Mosquito Caccia' ... come in, è probabilmente un po 'la mano pesante per raggiungere questo obiettivo , rispetto alla soluzione dei simonrjones. – kander

Problemi correlati