Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework Zend EmailAddress验证返回多个错误_Zend Framework_Zend Form_Zend Form Element_Zend Validate - Fatal编程技术网

Zend framework Zend EmailAddress验证返回多个错误

Zend framework Zend EmailAddress验证返回多个错误,zend-framework,zend-form,zend-form-element,zend-validate,Zend Framework,Zend Form,Zend Form Element,Zend Validate,当用户输入无效的电子邮件地址时,我无法使Zend_Validate_EmailAddress仅显示1条错误消息。代码是 $email = new Zend_Form_Element_Text('email'); $email->setLabel('Email: ') ->addFilter('StringTrim') ->addFilter('StripTags') ->addValidator('EmailAddress',true, array

当用户输入无效的电子邮件地址时,我无法使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验证只返回一条错误消息的想法。

对我来说,问题不在于这些消息对于普通用户来说过于技术化:这实际上是一个可以通过覆盖单个消息模板来处理的次要问题

对我来说,最基本的问题是这个验证器固有地返回多条消息,而我们只需要一条消息

我一直不得不对标准验证器进行分类:

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',
));
注意:虽然答案类似,但被接受的答案实际上并不满足您的要求。它确实为字段设置了一条错误消息,但听起来您需要将来自两个验证器(一个用于电子邮件格式,另一个用于电子邮件格式)的消息分开。为此,在我看来,您需要更改
电子邮件地址
验证程序本身的行为。

试试这个

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

您可以将这一行放在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;
    }

你必须这样写验证器

$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>") )
);
$email->addValidator(
“电子邮件地址”,
是的,
数组('messages'=>array('emailAddressInvalidFormat'=>“电子邮件地址无效…”!
,“emailAddressInvalidHostname”=>“电子邮件地址无效…”!
,“hostnameUnknownTld”=>“电子邮件地址无效…”!
,“hostnameLocalNameNotAllowed”=>“电子邮件地址无效…”!
) );
完全重复:它起作用了。但我必须手动为validator添加ElementPrefixXPath。是否有任何方法可以自动添加元素页面内部,表单需要知道如何将短名称
'EmailAddress'
转换为完整的类名
PapayaSoft\u Validate\u EmailAddress
。元素前缀路径(预先配置为包括
Zend\u Validate\u
名称空间)是此信息所在的位置。我通常在表单的
init()
方法中手动添加其他名称空间。