我有以下代码为用户的电子邮件地址生成输入字段
$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生成相同的消息。
答案 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中添加更多方法,这样您就可以显示自己的消息,无论您正在使用哪种形式。
希望它可以帮助别人!