在Zend_Form中,如何避免Zend_Validate_Email生成多个错误?

9
我正在构建一个ZendFramework应用程序,其中有一个登录表单,要求输入电子邮件地址和密码。在尝试登录之前验证电子邮件地址似乎是有意义的,因为无效的电子邮件地址永远不会导致有效的登录尝试。Zend_Validate_EmailAddress似乎是正确的选择,但我遇到了一个问题,它生成了多个错误(代码后面有问题)。
我的表单目前如下:
//WPMail_Form_Login::init()
$email = $this->addElement('text', 'email', array(
    'label'=>'Email',
    'required'=>true,
    'filters'=>array('stringtrim'),
    'validators'=>array(array('emailaddress', true, array(
        'messages'=>array(
            'emailAddressInvalidHostname'=>'Your email address is invalid',
            'emailAddressInvalidFormat'=>'Your email address is invalid',
            '...'=>'(repeat for all message templates)'
        )
    ))),
));

在控制器中,我直接将表单传递到视图中:
// WPMail_AuthController::loginAction()
$this->view->form = $form;

在视图中,它直接被回显:

// views/scripts/auth/login.phtml
<?php echo $this->form ?>

目前的结果大致如下:
- Your email address is invalid
- 'asda!!!' does not match the expected structure for a DNS hostname
- 'asda!!!' does not appear to be a valid local network name

我想知道的是:是否可以配置Zend_Validate_EmailAddress,使其仅生成一个电子邮件无效错误? “配置”是指在不扩展类并使用自己的逻辑覆盖该类的情况下完成。谢谢。
2个回答

10

Zend表单元素有各种方法可以用来自定义消息。从文档中并不是非常清晰,但是addErrorMessage()可以在验证失败时设置单个自定义错误消息。

因此,您的示例会像这样:

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email')
      ->setRequired(true)
      ->addFilter('stringtrim')
      ->addValidator('emailAddress', true)
      ->addErrorMessage('Your email address is invalid');
$this->addElement($email);

请查看http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.validators.errors


太好了,谢谢!我实际上已经看到过这个,但是不知怎么地认为添加错误消息会使表单无效(就像它是在您自己验证时的一部分一样)...很高兴看到它这么简单! - kander
2
有时候会让人感到困惑... $email->addError($message) 会设置一个错误并标记为无效,但是 $email->addErrorMessage($message) 只是似乎设置了消息,覆盖了默认的消息,并没有设置错误! - simonrjones

1

由于这些消息是由一个验证器生成的,我认为不可能实现:-(

Zend_Validate_EmailAddress::isValid方法执行所有验证,并将错误作为整体生成。

一种“hacky”的解决方案是,在您的控制器中迭代错误,并删除每个具有多个错误的字段中除第一个之外的所有错误...但我真的不喜欢那样做...


当然,您可以继承它并修改默认行为...但是您说过您不想这样做,所以...


不过,如果我错了,而且有一种方法,我非常好奇它是什么;-)


1
实际上,这些消息是由两个验证器生成的!Zend_Validate_Hostname是通过Zend_Validate_Email间接调用的。 - kander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接