【问题标题】:How can I customise Zend_Form regex error messages?如何自定义 Zend_Form 正则表达式错误消息?
【发布时间】:2011-02-02 23:31:57
【问题描述】:

我有以下代码:

 $postcode = $form->createElement('text', 'postcode');
    $postcode->setLabel('邮政编码:');
    $postcode->addValidator('regex', false,
        array('/^[a-z]{1,3}[0-9]{1,3} ?[0-9]{1,3}[a-z]{1,3}$/i'));
    $postcode->addFilters(array('StringToUpper'));
    $postcode->setRequired(true);

它在表单中创建一个输入字段并设置一个正则表达式验证规则并且工作正常。

问题是当用户输入一个无效的邮政编码时它显示的错误信息是这样的:

'POSTCODE' 与模式不匹配
    '/^[a-z]{1,3}[0-9]{1,3} ?[0-9]{1,3}[a-z]{1,3}$/i'

(输入为 POSTCODE)

我怎样才能让这条消息更友好一点?

【问题讨论】:

    标签: php regex zend-framework zend-form forms


    【解决方案1】:

    我想记住了,你可以在Validator中设置错误信息:

    $postcode = $form->createElement('text', 'postcode');
    $postcode->setLabel('Post code:');
    $postcode->addValidator('regex', false, array(
        'pattern' => '/^[a-z]{1,3}[0-9]{1,3} ?[0-9]{1,3}[a-z]{1,3}$/i')
        'messages' => array(
            'regexInvalid'   => "Invalid type given, value should be string, integer or float",
            'regexNotMatch' => "'%value%' does not match against pattern '%pattern%'",
            'regexErrorous'  => "There was an internal error while using the pattern '%pattern%'"
        )
    );
    $postcode->addFilters(array('StringToUpper'));
    $postcode->setRequired(true);
    

    如果这不起作用,请尝试

    • setErrorMessages(array $messages):添加多个错误消息以显示在表单验证错误上,覆盖所有先前设置的错误消息。

    【讨论】:

      【解决方案2】:

      如果您将验证器定义为外部变量,请使用 setMessage():

      $validator = new Zend_Validate_Alnum();
      $validator->setMessage('My custom error message for given validation rule',
                             Zend_Validate_Alnum::INVALID);
      $formElement->addValidator($validator);
      

      正如您在上面的示例中看到的表单验证器与任何其他类型的 Zend_Validate_* 实例没有区别。

      设置验证消息涉及查看API Docs 并找出给定验证错误的消息常量(就像我在 Zend_Validate_Alnum::INVALID 的情况下所做的那样)。当然,如果您的 IDE 提供良好的上下文自动完成功能,只需键入验证器类就足够了 - 因为在大多数情况下,消息常量是不言自明的。

      另一种方法是使用 Zend_Form 的魔法方法,并简单地将“消息”键作为参数传递给您的验证器:

      $formElement->addValidator(array(
        'alnum', false, array('messages' => array(
           Zend_Validate_Alnum::INVALID => 'my message'
         ))
      ));
      

      这将在内部触发 Zend_Validate_Abstract 中定义的 setMessages() 方法,本质上只是为 Zend_Form 定义的捷径/节省时间。

      注意:ZF 手册中有一个关于验证消息的dedicated section

      【讨论】:

        【解决方案3】:

        您可以使用原始 Zend 邮政编码验证器

        $user->addElement('text', 'postcode', array('label' => 'Postcode *',
            'required' => true,        
            'class' => 'postcode_anywhere',
            "validators" => array(
                array("NotEmpty", false, array("messages" => array("isEmpty" => "Required *"),)),
                array('PostCode', false, array('locale' => 'en_GB')
                )
            ),
            'filters' => array(array('StringToUpper')),
            'class' => 'text'
                )
        );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-05
          • 2018-06-16
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          • 2017-02-05
          • 2021-07-04
          • 1970-01-01
          相关资源
          最近更新 更多