8

Ich habe den folgenden Code ein Eingabefeld für Benutzer-E-Mail-Adressezend Form E-Mail-Validierung

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email:') 
    ->addFilters(array('StringTrim', 'StripTags')) 
    ->addValidator('EmailAddress') 
    ->addValidator(new Zend_Validate_Db_NoRecordExists(
                 array(
                   'adapter'=>Zend_Registry::get('user_db'), 
                   'field'=>'email', 
                   'table'=>'tbl_user' 
                   ))) 
    ->setRequired(true) 
    ->setDecorators(array(
          array('Label', array('escape'=>false, 'placement'=>'append')), 
          array('ViewHelper'), 
          array('Errors'), 
          array('Description',array('escape'=>false,'tag'=>'div')), 
          array('HtmlTag', array('tag' => 'div')), 
         )); 
$this->addElement($email); 

jetzt das Problem zu erzeugen, ist, wenn der Benutzer für E-Mail ungültig Hostnamen eingeben, es 3 Fehler erzeugen. Nehmen wir an, Benutzer geben 'admin @ l' als E-Mail-Adresse ein und die Fehler lauten
* 'l' ist kein gültiger Hostname für die E-Mail-Adresse 'admin @ l' * 'l' stimmt nicht mit der erwarteten Struktur überein DNS-Hostname
* 'l' scheint ein lokaler Netzwerkname zu sein, aber lokale Netzwerknamen sind nicht zulässig

Ich möchte nur, dass es nur einen benutzerdefinierten Fehler anstelle all dieser gibt. Wenn ich die Fehlermeldung "Ungültige E-Mail-Adresse" durch die Methode addErrorMessage einstellt, wird erneut die gleiche Nachricht für die db_validation generiert.

Antwort

8

Nun, es ist eine späte Antwort, aber ich denke immer nützlich ist.

Einfach wahr als zweiter param von addValidator() hinzufügen

Von Zend docs (http://framework.zend.com/apidoc/1.8/):

addValidator (Linie 67)

Fügt einen Validator zum Ende der Kette

Wenn $ breakChainOnFailure wahr ist, dann wenn der Validator fehlschlägt, wird der nächste Validator in der Kette, falls einer existiert, nicht ausgeführt.

Rückkehr: Bietet eine fließend Schnittstelle

Zugang: public

hier die Signatur:

Zend_Validate addValidator (Zend_Validate_Interface $validator, [boolean $breakChainOnFailure = false]) 

Zend_Validate_Interface $validator 
boolean $breakChainOnFailure 

So ist der Code:

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email:') 
    ->addFilters(array('StringTrim', 'StripTags')) 
    ->addValidator('EmailAddress', TRUE ) // added true here 
    ->addValidator(new Zend_Validate_Db_NoRecordExists(
       array(
         'adapter'=>Zend_Registry::get('user_db'), 
         'field'=>'email', 
         'table'=>'tbl_user' 
         ), TRUE) 
      ); 
2
$email->addErrorMessage("Please Enter Valid Email Address"); 

können Sie benutzerdefinierte Validator verwenden. eine Datei email.php innerhalb Ordner Validate in Ihrer Bibliothek Ordner an der Wurzel

class Validate_Email extends Zend_Validate_Abstract 
{ 

    const INVALID = 'Email is required'; 
    protected $_messageTemplates = array(
    self::INVALID => "Invalid Email Address", 
    self::ALREADYUSED => "Email is already registered" 
    ); 

    public function isValid($value) 
    { 
      if(preg_match($email_regex, trim($value))){ 
      $dataModel = new Application_Model_Data(); //check if the email exists 
      if(!$dataModel->email_exists($value)){ 
       return true; 
      } 
      else{ 
       $this->_error(self::ALREADYUSED); 
       return false; 
      } 
      } 
      else 
      { 
      $this->_error(self::INVALID); 
      return false; 
      } 
    } 
} 

und in Ihnen form.php Datei

$mailValidator = new Validate_Email(); 
    $email->addValidator($mailValidator, true); 

Projekt erstellen Sie nicht weiß ob es funktioniert oder nicht, aber für mich funktionierte es im telefonfall. Mit freundlicher Genehmigung von http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/

+0

ja, aber ich habe auch DB Validator, der prüft, ob die E-Mail bereits verwendet wird, um mit der Website zu registrieren.und wenn ich die obige Nachricht hinzufüge, selbst wenn die E-Mail gültig ist, aber in der Datenbank existiert, wird sie die benutzerdefinierte Nachricht anzeigen. – Bryan

+0

Schau es Dir an !! Arbeitete dann besser wenn nicht funktioniert dann ist es in Ordnung !! –

+0

Ich werde es am Wochenende testen und werde es euch wissen lassen. danke – Bryan

5

Sie müssen erstellen eine Instanz von Zend_Validate_EmailAddr ess-Klasse und die setMessages Methode aufrufen und dann die Nachrichten überschreiben, die Sie mögen, die, die zu entfernen, dass man es so etwas wie dieses wäre erwähnen:

$emailValidator->setMessages(array(
    Zend_Validate_EmailAddress::INVALID_FORMAT => "Your error message", 
    Zend_Validate_Hostname::INVALID_HOSTNAME => "Your error message", 
    Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED => "Your error message" 
)); 

Ich hoffe, das jemand Hilfe :-)

+0

Danke, das war hilfreich! –

0

Verwendung Ein benutzerdefinierter Validator ist die einzige Möglichkeit, dieses Problem zu vermeiden.

Wenn das, was Sie wollen, ist:

  • nur eine Fehlermeldung, wenn sie die E-Mail-Adresse in einem falschen Format ist
  • Wenn das Format gut ist, dann überprüfen, ob die E-Mail-Adresse ist bereits in die Datenbank

Dann empfehle ich Ihnen, so etwas zu tun:

$where = array('users', 'email', array('field' => 'user_id', 
             'value' => $this->getAttrib('user_id'))); 
$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('E-mail:') 
     ->setRequired(true) 
     ->setAttrib('required name', 'email') // html5 
     ->setAttrib('maxlength', '50') 
     ->addFilter('StripTags') 
     ->addFilter('StringTrim') 
     ->addFilter('StringToLower') 
     ->addValidator('email', true) 
     ->addValidator('stringLength', true, array(1, 50)) 
     ->addValidator('db_NoRecordExists', true, $where) 
     ->addDecorators($this->_elementDecorators); 
$this->addElement($email); 

$this->getAttrib('user_id') repräsentiert die aktuelle Benutzer-ID.

Es gibt hier drei Validatoren, alle haben ihren zweiten Parameter $breakOnFailure auf false gesetzt. Wenn also ein Validator fehlschlägt, werden die anderen nicht aufgerufen.

Der erste Validator ist E-Mail, die meine eigenen benutzerdefinierten Validator ist:

class My_Validate_Email extends Zend_Validate_EmailAddress 
{ 
    public function getMessages() 
    { 
     return array('invalidEmail' => 'Your email address is not valid.'); 
    } 
} 

Sie diese Prüfung in Ihrer Bibliothek hinzufügen können, in/application/Bibliothek/My/Validate zum Beispiel, und fügen Sie dann $this->addElementPrefixPath('My_Validate', 'My/Validate', 'validator'); in Ihr Formular. Natürlich müssen Sie "My" durch den Namen Ihrer Bibliothek ersetzen.

Jetzt, wenn eine E-Mail im falschen Format ist, wird immer angezeigt "Ihre E-Mail-Adresse ist nicht gültig.". Wenn Ihre E-Mail zu lang ist und nicht in Ihr Datenbankfeld passt (z. B. VARCHAR (100)), werden Ihre StringLength-Validierungsfehler angezeigt, und im letzten Fall, wenn bereits ein Eintrag in der Datenbank vorhanden ist, nur dieser Fehler wird angezeigt.

Natürlich können Sie Ihrem benutzerdefinierten Validator weitere Methoden hinzufügen und setMessages überladen, so dass Sie Ihre eigenen Nachrichten unabhängig von der Form anzeigen können, an der Sie gerade arbeiten.

Ich hoffe, es kann jemandem helfen!