8

我有下面的代碼來生成輸入域用戶的電子郵件地址Zend的形式驗證電子郵件

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

現在的問題是,如果用戶輸入電子郵件無效的主機名,它產生3個錯誤。可以說用戶輸入'admin @ l'作爲電子郵件地址,並且錯誤將是
*'l'對於電子郵件地址'admin @ l'是無效的主機名稱
*'l'與期望的結構不匹配DNS主機名
*'l'似乎是本地網絡名稱,但不允許本地網絡名稱

我只是希望它只給出一個自定義錯誤而不是所有這些。如果我通過addErrorMessage方法設置了錯誤消息「無效的電子郵件地址」,它將再次針對db_validation生成相同的消息。

回答

8

嗯,這是一個遲到的答案,但我想,總是有用的。

只需添加在addValidator()

從Zend的文檔(http://framework.zend.com/apidoc/1.8/)的第二PARAM:

addValidator(線67)

添加一個驗證程序的末端的鏈

如果$ breakChainOnFailure爲true,那麼如果驗證程序失敗,鏈中的下一個 驗證程序(如果存在)將不會執行。

回報:提供流暢的界面

訪問:公共

這裏的招牌:

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

Zend_Validate_Interface $validator 
boolean $breakChainOnFailure 

因此,代碼爲:

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

您可以使用自定義的驗證。在項目

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; 
      } 
    } 
} 

的根源,並在您的庫中創建一個文件Email.php文件夾驗證文件夾你form.php的文件

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

不要知道它是否有效,但對我來說它在電話的情況下工作。的http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/

+0

是的,但我也有DB驗證器,它檢查電子郵件是否已用於註冊該網站。如果我添加上面的消息,即使在電子郵件有效但存在於數據庫中的情況下,它也會顯示自定義消息。 – Bryan 2010-12-21 08:34:08

+0

看看吧!如果沒有工作,那麼工作就更好了,那就沒問題了! – 2010-12-21 09:00:41

+0

我會在週末進行測試,並會讓你知道。謝謝 – Bryan 2010-12-23 11:50:58

5

你必須創建Zend_Validate_EmailAddr的一個實例ESS類並調用setMessages方法,然後覆蓋你喜歡的信息,刪除你提到它會是這樣的那些:

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

我希望這個幫助別人:-)

+0

謝謝,這很有幫助! – 2011-07-31 06:17:23

0

使用一個自定義驗證器是我發現避免這個問題的唯一方法。

如果你想要的是:

  • 只有一個錯誤消息,如果電子郵件地址是在一個錯誤的格式
  • 如果格式是好的,那麼驗證如果電子郵件地址已在數據庫

那麼我建議你做這樣的事情:

$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')代表當前用戶的標識

這裏有三個驗證器,他們所有的第二個參數$breakOnFailure設置爲false,所以如果驗證器失敗,其他的將不會被調用。

第一確認是電子郵件,這是我自己的自定義驗證:

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

您可以在庫中添加這個驗證,在/應用程序/庫/我的/驗證例如,然後添加 $this->addElementPrefixPath('My_Validate', 'My/Validate', 'validator'); 進入您的表單。當然,您需要用您的圖書館名稱替換「我的」。

現在,如果電子郵件格式錯誤,它將始終顯示「您的電子郵件地址無效。」。如果你的電子郵件太長而且不適合你的數據庫字段(例如VARCHAR(100)),它將顯示你的stringLength驗證器錯誤,並且在最後一種情況下,如果一個條目已經存在於數據庫中,只有這個將顯示錯誤。

當然,您可以將更多方法添加到自定義驗證程序和重載setMessages中,以便您可以顯示自己的消息,無論您正在使用哪種形式。

希望它可以幫助別人!