2

ユーザーが無効な電子メール アドレスを入力したときに、Zend_Validate_EmailAddress に 1 つのエラー メッセージのみを表示させることができません。コードは

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

そして、ユーザーがuser@email(tldなしで)無効な電子メールを入力すると、次のような複数のエラーが表示されます

'email' is no valid hostname for email address 'user@email'  
'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 つだけ返されるようにする方法について考えてみましょう。

4

4 に答える 4

2

この 1 行を isValid() 関数の最後に配置できますが、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;
    }
于 2012-06-12T11:43:35.893 に答える
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;
于 2011-11-02T14:21:34.453 に答える