8

我有以下代码为用户的电子邮件地址生成一个输入字段

$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 生成相同的消息。

4

5 回答 5

8

好吧,这是一个迟到的答案,但我认为总是有用的。

只需添加true作为addValidator()的第二个参数

来自 Zend 文档(http://framework.zend.com/apidoc/1.8/):

addValidator(第 67 行)

将验证器添加到链的末尾

如果 $breakChainOnFailure 为真,那么如果验证器失败,则链中的下一个验证器(如果存在)将不会被执行。

return:提供流畅的界面

访问:公共

这里的签名:

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 )
            );
于 2011-03-29T07:56:43.980 回答
5

您必须创建 Zend_Validate_EmailAddress 类的实例并调用 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"
));

我希望这对某人有帮助:-)

于 2011-06-26T19:52:05.413 回答
2
$email->addErrorMessage("Please Enter Valid Email Address");

您可以使用自定义验证器。在项目根目录下的文件中创建一个文件Email.php

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

在你的 form.php文件中

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

不知道它是否有效,但对我来说它在电话的情况下有效。礼貌 http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/

于 2010-12-21T07:46:14.293 回答
0

好像少了几行。。。

可能应该使用这个: $mailValidator = new Zend_Validate_EmailAddress();

您还可以在此处进行一些其他验证:http: //framework.zend.com/manual/en/zend.validate.set.html

于 2011-01-26T12:29:40.843 回答
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')表示当前用户的 id

这里有三个验证器,它们的第二个参数都$breakOnFailure设置为false,所以如果一个验证器失败,其他的就不会被调用。

第一个验证器是email,这是我自己的自定义验证器:

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

您可以将此验证器添加到您的库中,例如在 /application/library/My/Validate 中,然后添加 $this->addElementPrefixPath('My_Validate', 'My/Validate', 'validator'); 到您的表单中。当然,您需要将“My”替换为您的图书馆名称。

现在,如果电子邮件格式错误,它将始终显示“您的电子邮件地址无效。”。如果您的电子邮件太长并且不适合您的数据库字段(例如 VARCHAR(100)),它将显示您的 stringLength 验证器错误,并且在最后一种情况下,如果数据库中已经存在一个条目,则只有这个将显示错误。

当然,您可以在自定义验证器中添加更多方法并重载 setMessages,以便您可以显示自己的消息,无论您正在处理的表单是什么。

希望它可以帮助某人!

于 2012-01-15T09:52:43.433 回答