【问题标题】:Custom error message for input validators (using the array syntax)输入验证器的自定义错误消息(使用数组语法)
【发布时间】:2011-02-02 21:30:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: zend-framework validation custom-errors


    【解决方案1】:

    使用内置翻译器。

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

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

    【讨论】:

    • +1 酷!我不知道这个。但是,如果两个不同的验证器对消息键使用相同的值,这不会有问题吗?
    • @David 我认为 Zend 已经注意避免冲突。如果您查看类,消息键的前缀或后缀是类名,例如Zend_Validate_Alnum::INVALID == 'alnumInvalid'
    • 啊啊,明白了。是的,那些 Zend boyz 很聪明。所以我只需要确保任何声称具有Zend_Translate 意识的外部开发验证器都需要遵循某种类似的“命名空间”方案。谢谢! ;-)
    【解决方案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 的(真棒!)答案将完成这项工作。

    【讨论】:

    • 不,我是说我想将它保存在 $validators 中的单个数组中,'messages' 键会覆盖所有模板消息。虽然@Phil Brown 的建议很好,但我现在不会使用它。与@Maxence 的答案有关,但没有实例化每个新的验证器。
    • 啊啊,我想我明白了。对于给定的元素,您想要一个 single 消息模板(类似于“无效值”)用于该元素上的 所有 验证器吗?在这种情况下,我想您可以创建一个自定义装饰器来替换标准的错误装饰器。在验证失败时,您无需渲染 all 来自验证器的消息,而是渲染所需的 single 消息。你怎么想?
    • [稍微改写我之前的评论,以便更准确地反映我的意图] 啊,我想我明白了。对于给定的元素,您想要一个 single 错误消息模板 - 类似于“无效值” - 以防 任何 验证器在该元素上失败?在这种情况下,我想您可以创建一个自定义装饰器来替换标准的错误装饰器。在验证失败时,您只需呈现所需的单个消息,而不是呈现各个验证器附加到元素的所有消息。你怎么想?
    【解决方案3】:

    禁用元素上的翻译器将禁用所有验证器消息的翻译。不可能在表单或元素上使用翻译器并仅覆盖一个验证器消息。当元素被验证时,翻译器被注入到每个验证器中。如果设置,验证器将使用翻译器。因此不会使用自定义错误消息。

    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)
    

    【讨论】:

      【解决方案4】:

      使用 setMessage 并禁用翻译器(如果有)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        相关资源
        最近更新 更多