2009-08-06 14 views
9

Buduję aplikację ZendFramework, która jako formularz logowania prosi o podanie adresu e-mail i hasła - wydawało się, że sensowne jest zweryfikowanie adresu e-mail przed trafieniem do bazy danych z próbą zalogowania, ponieważ nieprawidłowy e-mail nigdy nie doprowadzi do prawidłowego trafienie. Zend_Validate_EmailAddress wydawał się być właściwą drogą, ale mam problem z generowaniem wielu błędów (pytanie na dole, po kodzie).W Zend_Form, jak uniknąć Zend_Validate_Email od generowania wielu błędów?

Moja postać ma obecnie następujące

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

W regulatorze ja bezpośrednio przekazać formularz do widzenia:

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

A w widoku, to bezpośrednio echo'd:

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

Wynik jest obecnie podobny do następującego:

- 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 

Co chcę wiedzieć, to: czy można skonfigurować Zend _ Sprawdź poprawność _ EmailAddress w taki sposób, że generuje tylko jeden błąd niepoprawny e-mail? Przez "configure" rozumiem, bez rozszerzania klasy i nadpisywania logiki własnymi.

TIA.

Odpowiedz

10

Zend Form Element ma różne metody, za pomocą których można dostosowywać wiadomości. Z dokumentów nie wynika to w niczym nadzwyczajnie, ale metoda addErrorMessage() ustawia pojedynczy niestandardowy komunikat o błędzie dotyczący niepowodzenia sprawdzania oryginalności.

Twój Przykładem może zatem wyglądać następująco:

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

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

+0

Cudownie, dzięki! Natknąłem się na to, ale jakoś założyłem, że dodanie komunikatu o błędzie unieważni formularz (jak w tym, że jest to część, kiedy robisz swoją własną walidację) .. cieszę się, że to jest takie proste! – kander

+2

Może to być mylące .. $ email-> addError ($ message) ustawi błąd i oznaczy go jako niepoprawny, ale pojawi się komunikat $ email-> addErrorMessage (komunikat $), aby ustawić komunikat, który nadpisuje domyślne i doesn "ustaw błąd! – simonrjones

+0

+1, dzięki za wskazówkę wiedzy – Ish

1

Ponieważ te wiadomości są generowane przez jeden weryfikatora, nie sądzę, że jest to możliwe :-(

Sposób Zend_Validate_EmailAddress::isValid wykonuje wszelkie walidację na generuje błędy jako całość, wydaje się.

Jednym z "hackowatych" rozwiązań byłoby powtórzenie w kontrolerze błędów i usunięcie wszystkich poza pierwszym, dla każdego pola, które ma więcej niż jeden ... Ale nie podoba mi się dźwięk tego ...


Możesz, oczywiście, niż dziedziczyć i zmodyfikować domyślne zachowanie ... ale stwierdził, że nie chcesz tego zrobić, więc ...


Mimo to, jeśli się mylę, i jest sposób, jestem bardzo ciekawy ;-)

+1

Właściwie komunikaty zostały wygenerowane przez dwa walidatorami!Nazwa Zend_Validate_Hostname była wywoływana pośrednio przez Zend_Validate_Email. – kander

3

Sprawdź ten tutorial przez Pádraic Brady na temat korzystania z Zend_Form.

W szczególności sekcja "Krok 4: Obsługa komunikatów o błędach z niestandardowym dekoratorem."

+0

Masz na myśli użycie tłumacza w kroku 5 Bill? To wciąż wydaje się wymagać wielu deklaracji domyślnego komunikatu dla każdego typu błędu. – simonrjones

+0

Nie, chodzi mi o krok 4. Mógłbyś napisać niestandardowy dekorator błędów, który zwróci najpierw * wiadomość * z walidatora wiadomości e-mail, zamiast implodować wszystkie wiadomości. –

+0

Świetny link! Wygląda na to, że niestandardowe dekoratory byłyby innym sposobem (w porównaniu do rozwiązania simonrjones), aby uzyskać to, co chcę, chociaż przypomina mi to szkic "Mosquito Hunting" Monty Pythona ... ponieważ jest to prawdopodobnie trochę ciężkie, aby osiągnąć ten cel , w porównaniu do rozwiązania simonrjonesa. – kander