【问题标题】:Clearing Validation Error Messages from a Zend Form Element从 Zend 表单元素中清除验证错误消息
【发布时间】:2011-04-20 17:41:05
【问题描述】:

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

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

我的尝试和结果

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

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

<?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");

【问题讨论】:

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


    【解决方案1】:

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

    一些开发人员可能希望为验证器提供自定义错误消息。 Zend_Form_Element::addValidator() 方法的 $options 参数允许您通过提供键 '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。错误代码由默认的 Errors 装饰器自动传递给适配器;然后,您可以通过为验证器的各种错误代码设置翻译来指定自己的错误消息字符串。

    所有的验证信息都可以从

    中的文件自定义

    文件应该在APPLICATION_PATH/resources/languages,但实际上可以放在任何地方,只要你告诉Zend_Translate在哪里可以找到它。

    【讨论】:

    • 根据library/ 结构,该文件应该放在哪里?
    【解决方案2】:

    当你像这样定义一个表单元素时

    $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>
    

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

    【讨论】:

      【解决方案3】:

      攻击它的一种方法是通过扩展您计划使用的验证器并覆盖消息来创建自己的自定义验证器。例如,查看 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",
          );
      
          [ ... ]
      }
      

      然后,不要使用 Zend_Validate_Alnum,而是使用 My_Validate_Alnum 作为您的验证器。自定义验证器的创建非常简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多