0

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

4 回答 4

2

如果您只是尝试更改表单元素的验证消息,我总是这样做(在扩展 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 的(真棒!)答案将完成这项工作。

于 2011-02-03T04:14:15.597 回答
2

使用内置翻译器。

例如,在配置文件中配置翻译器以使用简单数组

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

这告诉翻译应用程序资源插件您想要

  • 将您的翻译保存在APPLICATION_PATH/lang
  • 使用阵列适配器(最简单)
  • 扫描语言/区域设置的翻译目录
  • 忽略有关未知翻译的错误(即用户更喜欢 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"
于 2011-02-02T23:09:39.820 回答
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)
于 2013-01-23T14:39:35.843 回答
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));

如果您在表单元素上使用验证器,则必须禁用该元素上的翻译器。

于 2011-02-03T08:02:33.117 回答