如何自定义Zend_Form正则表达式错误消息?

时间:2010-03-31 14:52:50

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

我有以下代码:

    $postcode = $form->createElement('text', 'postcode');
    $postcode->setLabel('Post code:');
    $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' does not match against pattern
    '/^[a-z]{1,3}[0-9]{1,3} ?[0-9]{1,3}[a-z]{1,3}$/i'

(输入为POSTCODE)

如何更改此消息以使其更友好?

3 个答案:

答案 0 :(得分:5)

我想记住,你可以在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):添加多个错误消息以显示表单验证错误,覆盖所有先前设置的错误消息。

答案 1 :(得分:1)

如果您将验证器定义为外部变量,请使用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的魔术方法,并简单地将'messages'键作为参数传递给验证器:

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

这将在内部触发Zend_Validate_Abstract中定义的setMessages()方法,实质上只是为Zend_Form定义的快捷方式/时间保护程序。

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

答案 2 :(得分:0)

您可以使用原始的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'
        )
);