Пользовательское сообщение об ошибке для входных валидаторов (с использованием синтаксиса массива) - PullRequest
0 голосов
/ 03 февраля 2011

ZF 1.11.2
Я пробовал большинство синтаксисов.Они не щелкали.

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

Как в мире вы устанавливаете пользовательское сообщение об ошибке для alnum с синтаксисом выше?Используя 'messages' => array('Not alnum!!')?Да, хорошо ... Как?Должно быть, я пробовал 100 вложенных массивов.

Ответы [ 4 ]

2 голосов
/ 23 января 2013

Отключение переводчика на элементе отключит перевод всех сообщений валидатора.Невозможно использовать переводчик в форме или элементе и перезаписать только одно сообщение валидатора.Когда элемент проверен, переводчик вводится каждому валидатору.Валидатор будет использовать переводчик, если он установлен.Таким образом, пользовательское сообщение об ошибке не будет использоваться.

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)
2 голосов
/ 03 февраля 2011

Если вы просто пытаетесь изменить сообщения проверки для элемента формы , я всегда делал это следующим образом (внутри класса, расширяющего 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 голосов
/ 03 февраля 2011

Используйте встроенный переводчик.

Например, настройте переводчик в вашем конфигурационном файле для использования простого массива

; 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
  • , используйте адаптер Array (самый простой)
  • сканируйте каталог перевода на языки / locales
  • ignoreошибки о неизвестных переводах (т. е. пользователь предпочитает 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"
0 голосов
/ 03 февраля 2011

Используйте setMessage и отключите переводчик, если он у вас есть.

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

Если вы используете свой валидатор для элемента формы, вы должны отключить переводчик для элемента.

...