2

當用戶輸入無效的電子郵件地址時,我無法使Zend_Validate_EmailAddress只顯示1個錯誤消息。該代碼是Zend EmailAddress驗證返回多個錯誤

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email: ') 
    ->addFilter('StringTrim') 
    ->addFilter('StripTags') 
    ->addValidator('EmailAddress',true, array(... error msgs ...)) 
    ->addValidator(new Zend_Validate_Db_NoRecordExists(array(... db + table + col details ...),true, array(... error msgs ...))) 
    ->setRequired(true); 
$this->addElement($email); 

當用戶輸入無效的電子郵件像[email protected](不TLD)顯示它像

'email' is no valid hostname for email address '[email protected]' 
'email' does not match the expected structure for a DNS hostname 
'email' appears to be a local network name but local network names are not allowed 

多個錯誤,我不能使用addErrorMessage('...'),因爲我需要顯示爲無效不同的消息電子郵件和電子郵件已存在於數據庫中。因此,任何想法如何使EmailAddress驗證返回只有1錯誤消息。

+0

精確複製:http://stackoverflow.com/questions/1239719/in- a-zend-form-how-to-avoid-zend-validate-email-from-generating-multiple-errors – emaillenin

回答

7

對我來說,問題不在於消息對於普通用戶來說過於技術性:這確實是一個側重點,可以通過覆蓋單個消息模板來處理。

對我來說,根本的問題是,這個驗證器固有地返回多個消息,我們只想要一條消息。

我一直不得不求助於子類標準的驗證:

class PapayaSoft_Validate_EmailAddress extends Zend_Validate_EmailAddress 
{ 
    protected $singleErrorMessage = "Email address is invalid"; 

    public function isValid($value) 
    { 
     $valid = parent::isValid($value); 
     if (!$valid) { 
      $this->_messages = array($this->getSingleErrorMessage()); 
     } 
     return $valid; 
    } 

    public function getSingleErrorMessage() 
    { 
     return $this->singleErrorMessage; 
    } 

    public function setSingleErrorMessage($singleErrorMessage) 
    { 
     $this->singleErrorMessage = $singleErrorMessage; 
     return $this; 
    } 
} 

然後用法如下:

$validator = new PapayaSoft_Validate_Email(); 
$validator->setSingleErrorMessage('Your email is goofy'); 
$element->addValidator($validator, true); 

另外,使用短形式,你需要添加一個驗證器的新名稱空間前綴,以便從新的非Zend名稱空間中獲取短密鑰「EmailAddress」。然後:

$element->addValidator('EmailAddress', true, array(
    'singleErrorMessage' => 'Your email is goofy', 
)); 

注:雖然question noted by @emaillenin是相似的,公認的答案有沒有真正滿足您的要求。它確實爲字段設置了一條錯誤消息,但聽起來好像你需要分別從兩個驗證器(一個用於電子郵件格式,另一個用於電子郵件)已經存在單獨的消息。爲此,我認爲您需要更改驗證器本身的行爲。

+0

我會測試它今晚 – Bryan

+0

它的工作。但我必須手動爲驗證器添加ElementPrefixPath。有什麼方法可以自動添加元素頁面 – Bryan

+0

在內部,表單需要知道如何將簡稱「EmailAdress」轉換爲完整的類名「PapayaSoft_Validate_EmailAdress」。元素前綴路徑 - 預配置爲包含'Zend_Validate_'名稱空間 - 是此信息所在的位置。我通常在表單的'init()'方法中添加我的其他名稱空間 - 手工,不幸的是 - 。 –

0

試試這個,

$po = $this->getRequest()->getPost(); 
$email = $po['email']; 
$emval = new Zend_Validate_EmailAddress(); 
if (!$emval->isValid($email)) { 
$this->view->emailerror = "Please enter a valid email ID."; 
} 

,並在其視圖頁下面放要顯示錯誤消息的代碼,

 echo $this->emailerror; 
2

您可以參考isValid結束就把這一行( )funciton但在返回false之前。

$this->_messages = array($this->_messageTemplates[self::INVALID]); 

這樣的:

public function isValid($value) 
    { 
     if (!is_string($value)) { 
      $this->_error(self::INVALID); 
      return false; 
     } 

     $matches = array(); 
     $length = true; 
     $this->_setValue($value); 

     // Split email address up and disallow '..' 
     if ((strpos($value, '..') !== false) or 
      (!preg_match('/^(.+)@([^@]+)$/', $value, $matches))) { 
      $this->_error(self::INVALID_FORMAT); 
      return false; 
     } 

     $this->_localPart = $matches[1]; 
     $this->_hostname = $matches[2]; 

     if ((strlen($this->_localPart) > 64) || (strlen($this->_hostname) > 255)) { 
      $length = false; 
      $this->_error(self::LENGTH_EXCEEDED); 
     } 

     // Match hostname part 
     if ($this->_options['domain']) { 
      $hostname = $this->_validateHostnamePart(); 
     } 

     $local = $this->_validateLocalPart(); 

     // If both parts valid, return true 
     if ($local && $length) { 
      if (($this->_options['domain'] && $hostname) || !$this->_options['domain']) { 
       return true; 
      } 
     } 

     $this->_messages = array($this->_messageTemplates[self::INVALID]); // ===========By Jagdish Ram JPK --DS----------- 

     return false; 
    } 
1

你必須寫驗證這樣的... ...

$email->addValidator(
    'EmailAddress', 
    true, 
    array('messages' => array('emailAddressInvalidFormat' => "Email Address is Not Valid... !<br>", "emailAddressInvalidHostname"=>"Email Address is Not Valid... !<br>", "hostnameUnknownTld"=>"Email Address is Not Valid... !<br>","hostnameLocalNameNotAllowed"=>"Email Address is Not Valid... !<br>")) 
);