输入验证器的自定义错误消息(使用数组语法)

时间:2011-02-02 21:30:05

标签: zend-framework validation custom-errors

ZF 1.11.2
我已经尝试了大多数语法。他们没有点击。

$validators = array('product_name' => array('alnum'));
//...
$input = new Zend_Filter_Input($filters, $validators, $_POST);

您如何使用上述语法为alnum设置自定义错误消息?使用'messages' => array('Not alnum!!')?是的,好吧......怎么样?我一定试过100个嵌套数组。

4 个答案:

答案 0 :(得分:2)

使用内置翻译器。

例如,在配置文件中配置转换程序以使用简单数组

; Translations
resources.translate.data = APPLICATION_PATH "/lang"
resources.translate.adapter = "Array"
resources.translate.options.scan = "directory"
resources.translate.options.disableNotices = "1"

这告诉您想要

的Translate应用程序资源插件
  • 将您的翻译保留在APPLICATION_PATH/lang
  • 使用数组适配器(最简单)
  • 扫描翻译目录中的languages / locales
  • 忽略有关未知翻译的错误(即用户优先选择en_AU,但您没有该语言的特定翻译文件)

现在,为您要支持的任何语言创建文件夹。至少,您需要application/lang/en。例如

application
    lang
        en
        en_AU
        en_US

在每个语言文件夹中,创建一个translate.php文件。此文件将包含(并返回)每个转换的键/值对数组。您可以在验证器类中找到每个验证器消息的密钥。以下是Alnum验证器

的示例
<?php
// application/lang/en/translate.php

return array(
    Zend_Validate_Alnum::NOT_ALNUM => 'Not alnum!!',
    Zend_Validate_Alnum::INVALID   => 'Not valid!!'
);

对于所有Zend验证器,您还可以在邮件中使用%value%占位符,例如

Zend_Validate_Alnum::NOT_ALNUM => "'%value%' is not alpha-numeric"

答案 1 :(得分:2)

如果您只是尝试更改 form 元素的验证消息,我总是这样做(在扩展Zend_Form的类中):

$this->addElement('text', 'myTextField', array(
    'label' => 'The Label',
    'description' => 'The description for the field...',
    'filters' => array(
        'StringTrim',
        // etc
    ),
    'validators' => array(
        array('NotEmpty', true, array(
            'messages' => 'This field is required',
        )),
        array('AnotherValidator', true, array(
            'messages' => 'Bad value',
        )),
    // etc
    ),
));

你是说这不起作用?或者你在更一般的背景下使用你的验证器,在这种情况下@Phil Brown(真棒!)的答案将完成这项工作。

答案 2 :(得分:2)

禁用元素上的转换器将禁用所有验证器消息的转换。无法在表单或元素上使用转换器,只覆盖一个验证器消息。当元素被验证时,翻译器被注入每个验证器。如果已设置,验证器将使用转换器。因此,将不会使用自定义错误消息。

Zend_Validate_Abstract来:: _的CreateMessage()

// $message is your custom error message
$message = $this->_messageTemplates[$messageKey];

if (null !== ($translator = $this->getTranslator())) {
    // your custom error message gets overwritten because the messageKey can be translated
    if ($translator->isTranslated($messageKey)) {
        $message = $translator->translate($messageKey);
    } else {
        $message = $translator->translate($message);
    }
}

我认为只能通过禁用元素上的翻译器来使用自定义错误消息。

$element->setDisableTranslator(true)

答案 3 :(得分:0)

如果你有翻译器,请使用setMessage并禁用翻译器。

$alnum = new Zend_Validate_Alnum();
$alnum->setDisableTranslator(true);
$alnum->setMessage(
    'Not alnum!!', 
     Zend_Validate_Alnum::NOT_ALNUM
);
$validators = array('product_name' => array($alnum));

如果在表单元素上使用验证器,则必须禁用元素上的转换器。