从Zend表单元素清除验证错误消息

Son*_*nny 3 php zend-framework zend-form zend-validate

我有一个用于捕获电子邮件地址的表单元素.我正在使用Zend_Validate_EmailAddress元素,它会生成不是非常用户友好的错误消息.

我的第一步是指定更加用户友好的新消息,但有些检查根本不适合用户友好的消息.然后我尝试isValid()在表单上运行后清除这些消息并指定我自己的消息,但是我找到的所有函数都不会清除消息.

我尝试了什么和结果

  1. setErrorMessages() - 这里设置的值似乎完全被忽略了
  2. clearErrorMessages() - 似乎被忽略了
  3. setErrors() - 添加我的消息,但保留其他信息

这是在我的自定义视图脚本中显示错误的代码:

<?php if ($this->element->hasErrors()): ?>
    <?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

我的解决方案

我授予戈登的答案,因为他的解决方案是最完整的,但是我最终使用addErrorMessage()的元素函数像这样:

$element->addValidator('EmailAddress', false, $this->_validate['EmailAddress'])
        ->addErrorMessage("'%value%' is not a valid email address");

$element->addValidator('Date', false, array('MM/dd/yyyy'))
        ->addErrorMessage("Date must be in MM/DD/YYYY format");
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 5

从参考指南(强调我的):

一些开发人员可能希望为验证器提供自定义错误消息.该方法的$options参数Zend_Form_Element::addValidator()允许您通过提供密钥'messages'并将其映射到用于设置消息模板的键/值对数组来实现.您需要知道特定验证器的各种验证错误类型的错误代码.

所以你可以这样做:

$form = new Zend_Form;
$username = new Zend_Form_Element_Text('username');
$username->addValidator('regex', false, array(
    '/^[a-z]/i',
    'messages' => array(
        'regexInvalid'  => 'foo',
        'regexNotMatch' => 'bar',
        'regexErrorous' => 'baz'
    )
));
$form->addElement($username);
$form->isValid(array('username' => '!foo'));
Run Code Online (Sandbox Code Playgroud)

然后将为错误消息呈现"bar",因为正则表达式不匹配,因为它不是以来自aZ的字母开头.

这相当于使用:

$username->setErrorMessages(
    array(
        'regexNotMatch' => 'The value %value% must start with a-Z',
        …
    )
);
Run Code Online (Sandbox Code Playgroud)

我使用了不同的模式来说明如何在模式中使用经过验证的值.

setErrors如果要删除任何默认模板,也可以使用,例如

$username->setErrors(array('The value must start with a-Z'));
Run Code Online (Sandbox Code Playgroud)

无论你做什么,你必须验证之前配置它isValid.运行验证后,否则Zend_Form_Element 包含默认错误消息.我不知道有什么方法可以重置那个(虽然有人可能想要纠正我).

进一步引用参考指南:

更好的选择是在表单中使用Zend_Translate_Adapter.错误代码由默认的错误装饰器自动传递给适配器; 然后,您可以通过为验证程序的各种错误代码设置翻译来指定自己的错误消息字符串.

可以从文件中自定义所有验证消息

该文件应该在APPLICATION_PATH/resources/languages,但只要你知道Zend_Translate在哪里找到它就可以放在任何地方.