在表单中,我有以下元素:
$email = new Zend_Form_Element_Text('username');
$email
->setLabel($this->getView()->l('E-mail'))
->setRequired(TRUE)
->addValidator('EmailAddress')
->addValidator('Db_NoRecordExists', true,
array(
'table' => 'pf_user',
'field' => 'email',
'messages' => array(
'recordFound' => 'This username is already registered',
)
))
->setErrorMessages(array(
'emailAddressInvalidFormat' => 'You must enter a valid e-mail',
'isEmpty' => 'You must enter an e-mail',
'recordFound' => 'This e-mail has already registered in out database'
));
$form->addElement($email)
问题是我总是得到相同的消息“你必须输入有效的电子邮件”(第一个)。有人知道这是什么错误吗?
答案 0 :(得分:1)
实际上,您正在做的是以下内容:
更正确的方法是在验证程序中设置自定义消息。调用验证器验证元素时,如果验证失败,验证器将调用元素上的setErrorMessages来设置您指定的自定义错误。请使用以下此类代码设置自定义消息。
$element->addValidator( array( 'Db_NoRecordExists', true, array(
'messages' = array(
Zend_Validate_Db_Abstract::ERROR_NO_RECORD_FOUND => 'Myy custom no error record',
Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND => 'My custom record error'
)
) ) );
你会发现通常在每个验证器类中都有一些consts指定一种类型的错误。在这种情况下,consts位于DB_NoRecordExists类的父类中,但通常您可以直接在顶部附近的类中找到它们。
答案 1 :(得分:0)
基本上通过将'true'作为第二个参数传递给addValidator()
,你会说验证器在验证器失败时打破链。由于“”不是有效的电子邮件地址,因此第一个电子邮件验证程序失败并打破链
来自Zend Doc http://framework.zend.com/manual/en/zend.validate.validator_chains.html
在某些情况下,如果有一个验证器打破链条是有道理的 其验证过程失败。 Zend_Validate支持此类用例 使用addValidator()方法的第二个参数。通过设置 $ breakChainOnFailure为TRUE,添加的验证器将打破链 失败时执行,避免运行任何其他验证 被认定为不必要或不适合的人 情况。如果上面的例子写成如下,那么 如果字符串长度不会发生字母数字验证 验证失败:
$validatorChain->addValidator(
new Zend_Validate_StringLength(array('min' => 6,
'max' => 12)),
true)
->addValidator(new Zend_Validate_Alnum());