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

时间:2011-04-20 17:41:06

标签: php zend-framework zend-form zend-validate

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

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

我尝试了什么和结果

  1. setErrorMessages() - 此处设置的值似乎完全被忽略
  2. clearErrorMessages() - 似乎被忽略
  3. setErrors() - 添加我的信息,但保留其他信息
  4. 这是在我的自定义视图脚本中显示错误的代码:

    <?php if ($this->element->hasErrors()): ?>
        <?php echo $this->formErrors($this->element->getMessages()); ?>
    <?php endif; ?>
    

    我的解决方案

    我正在给答案Gordon,因为他的解决方案最完整,但我最终在元素like this上使用了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 个答案:

答案 0 :(得分: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'));

然后会为错误消息呈现“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。错误代码由默认的错误装饰器自动传递给适配器;然后,您可以通过为验证程序的各种错误代码设置翻译来指定自己的错误消息字符串。

可以从

中的文件自定义所有验证消息

该文件应位于APPLICATION_PATH/resources/languages,但只要您告诉Zend_Translate在哪里找到它,就可以放在任何位置。

答案 1 :(得分: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>

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

答案 2 :(得分: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。自定义验证器非常易于创建。