Zend framework zend表单电子邮件验证

Zend framework zend表单电子邮件验证,zend-framework,zend-form,email-validation,zend-form-element,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

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

$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_验证再次生成相同的消息

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

不知道它是否有效,但对我来说,它在电话的情况下有效。承蒙

它似乎少了好几行

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


您还可以做一些其他验证,请参见此处:

嗯,这是一个迟来的答案,但我认为它总是有用的

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

来自Zend docs():

addValidator(第67行)

将验证程序添加到链的末尾

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

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

您必须创建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"
));
$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);

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

使用自定义验证器是我发现的避免此问题的唯一方法

如果您想要的是:

  • 如果电子邮件地址格式错误,则只有一条错误消息
  • 如果格式良好,则验证电子邮件地址是否已在数据库中
那么我建议你这样做:

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

这里有三个验证器,所有验证器的第二个参数
$breaknfailure
都设置为
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->addlementprefixpath('My_Validate','My/Validate','validator')
进入你的状态。当然,您需要将“My”替换为您的库的名称

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

当然,您可以在自定义验证器中添加更多方法并重载setMessages,这样您就可以显示自己的消息,无论您使用的是什么表单


希望它能帮助别人

是的,但我也有DB验证器,它检查电子邮件是否已经被用于注册网站。如果我添加了上面的消息,即使电子邮件有效但存在于数据库中,它也会显示自定义消息。请查看!!如果不起作用那就好了!!