zend表单电子邮件验证

时间:2010-12-17 10:47:18

标签: zend-framework zend-form email-validation zend-form-element

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

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

5 个答案:

答案 0 :(得分:8)

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

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

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

  

addValidator(第67行)

     

在链的末尾添加验证器

     

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

     

return:提供流畅的界面

     

access:public

签名:

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

答案 1 :(得分: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"
));

我希望这有助于某人: - )

答案 2 :(得分: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/

提供

答案 3 :(得分:0)

似乎缺少了几行...

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

您还可以执行其他验证,请参阅此处:http://framework.zend.com/manual/en/zend.validate.set.html

答案 4 :(得分: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,因此如果验证器失败,则不会调用其他验证器。

第一个验证器是电子邮件,这是我自己的自定义验证器:

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'); 进入你的形式。当然,您需要用库的名称替换“我的”。

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

当然,您可以在自定义验证器和重载setMessages中添加更多方法,这样您就可以显示自己的消息,无论您正在使用哪种形式。

希望它可以帮助别人!