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

3
我有一个表单元素用于获取电子邮件地址。我在该元素上使用了Zend_Validate_EmailAddress,但它生成的错误消息并不太用户友好。
我的第一步是指定更加用户友好的新消息,但是其中一些检查根本不适合用户友好的消息。然后,我尝试在运行isValid()函数后简单地清除这些消息并指定自己的消息,但我找到的所有函数都无法清除这些消息。
我尝试过的方法及其结果如下:
  1. setErrorMessages() - 此处设置的值似乎完全被忽略了
  2. clearErrorMessages() - 似乎被忽略了
  3. setErrors() - 添加了我的消息,但其他消息仍保持不变
以下是显示自定义视图脚本中错误的代码:
<?php if ($this->element->hasErrors()): ?>
    <?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>

我的解决方案

我将把答案授予戈登,因为他的解决方案最完整,但我最终使用了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");
3个回答

5

来自参考指南(我强调):

一些开发人员可能希望为验证器提供自定义错误消息。通过提供键“messages”并将其映射到用于设置消息模板的键/值对数组,Zend_Form_Element::addValidator()方法的$options参数允许您这样做。 您需要了解特定验证器各种验证错误类型的错误代码

所以你可以这样做:

$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'));

这将会显示“bar”作为错误信息,因为正则表达式不匹配,因为它不以a-Z中的字母开头。

这相当于使用:

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

我使用了不同的模式来说明如何在模式中使用验证后的值。
如果您想删除任何默认模板,可以使用setErrors
$username->setErrors(array('The value must start with a-Z'));

无论你做什么,都必须在使用 isValid 进行验证之前配置。一旦运行验证,否则 Zend_Form_Element 将包含默认的错误消息。我不知道是否有任何方法可以重置它(尽管有人可能会纠正我)。
进一步引用参考指南:
更好的选择是在表单中使用 Zend_Translate_Adapter。错误代码将由默认的 Errors 修饰器自动传递给适配器;然后,您可以通过为验证器的各种错误代码设置翻译来指定自己的错误消息字符串。
所有验证消息都可以从文件中自定义。 文件应该放在APPLICATION_PATH/resources/languages,但只要您告诉Zend_Translate在哪里找到它,它实际上可以放在任何地方。

library/的结构中,该文件应该放在哪里? - Sonny

1

当您像这样定义表单元素时

$titel = new Zend_Form_Element_Text ( "titel" );
$titel->setLabel ( "Titel" )->setRequired ( true )
      ->addValidator ( 'regex', false, array ("/[\pL\pN_\-]+/" ) );

你可以在视图脚本中指定错误信息

<?php 
    $form = $this->form;
    $errorsMessages =$this->form->getMessages();
?>

<div>
    <label>Titel</label> <?php echo $form->titel->renderViewHelper()?>
    <?php 
           if(isset($errorsMessages['titel'])){
               echo "<p class='error'>There's something wrong!</p>";
           }
    ?>
</div>

我不知道这是否符合你的方式,但我真的很喜欢以这种方式定义我的表单;)


1

你可以通过创建自己的自定义验证器来解决这个问题,方法是扩展你计划使用的验证器并覆盖消息。例如,看一下Zend_Validate_Alnum,它看起来像这样:

class Zend_Validate_Alnum extends Zend_Validate_Abstract
{
    const INVALID      = 'alnumInvalid';
    const NOT_ALNUM    = 'notAlnum';
    const STRING_EMPTY = 'alnumStringEmpty';

    [ ... ]

    protected $_messageTemplates = array(
        self::INVALID      => "Invalid type given. String, integer or float expected",
        self::NOT_ALNUM    => "'%value%' contains characters which are non alphabetic and no digits",
        self::STRING_EMPTY => "'%value%' is an empty string",
    );

    [ ... ]
}

在你自己的类中重写$_messageTemplates数组,就像这样

class My_Validate_Alnum extends Zend_Validate_Alnum
{
    protected $_messageTemplates = array(
        self::INVALID      => "My invalid message",
        self::NOT_ALNUM    => "foo",
        self::STRING_EMPTY => "'%value%' is bar",
    );

    [ ... ]
}

那么,您可以使用My_Validate_Alnum作为验证器,而不是使用Zend_Validate_Alnum。自定义验证器非常容易创建。


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