Zend EmailAddress Validation возвращает несколько ошибок - PullRequest
2 голосов
/ 30 октября 2011

Я не могу заставить 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  

.Мне нужно отобразить другое сообщение для недействительной электронной почты, и для электронной почты уже существует в базе данных.Таким образом, любая идея, как сделать валидацию EmailAddress, возвращает только 1 сообщение об ошибке.

Ответы [ 4 ]

7 голосов
/ 30 октября 2011

Для меня проблема не в том, что сообщения являются слишком техническими для обычного пользователя: это действительно побочная проблема, которую можно решить путем переопределения отдельных шаблонов сообщений.

Для меня фундаментальная проблема заключается в том, что этот валидатор по своей сути возвращает несколько сообщений, и нам нужно только одно сообщение.

Мне всегда приходилось прибегать к подклассификации стандартного валидатора:

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

В качестве альтернативы, используя краткую форму, вам нужно добавить новый префикс пространства имен для валидаторов, чтобы короткий ключ «EmailAddress» выбирался из нового пространства имен, отличного от Zend. Тогда:

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

Примечание: Хотя вопрос , отмеченный @ emaillenin , аналогичен, принятый ответ на самом деле не соответствует вашим требованиям. Он устанавливает одно сообщение об ошибке для поля , но похоже, что вам нужно иметь отдельные сообщения, приходящие от двух валидаторов (одно для формата электронной почты, другое для электронной почты- уже существует). Для этого мне кажется, что вам нужно изменить поведение самого валидатора EmailAddress.

2 голосов
/ 12 июня 2012

Вы можете поместить эту строку в конец функции 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;
    }
1 голос
/ 13 февраля 2013

вы должны написать валидатор, как это ...

$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>") )
);
0 голосов
/ 02 ноября 2011

Попробуйте это,

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