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