Получать доступ к пользовательским сообщениям об ошибках для валидатора InArray при использовании Zend_Form_Element_Select - PullRequest
2 голосов
/ 24 августа 2009

Я использую Zend Framework 1.62 (потому что мы разворачиваем готовый продукт на экземпляр Red Hat, у которого недостаточно hgih-версии PHP для поддержки> ZF1.62).

При создании формы с использованием Zend Form, я добавляю элемент select, добавляю несколько параметров. Я использую Zend Form в качестве слоя проверки объекта, передавая через него значения объектов и используя метод isValid, чтобы определить, все ли значения попадают в нормальные параметры.

Zend_Form_Element_Select работает точно так же, как и ожидалось, показывая недействительным, если вводится любое другое значение, кроме одного из добавленных мною вариантов выбора.

Проблема возникает, когда я хочу отобразить форму в какой-то момент, я не могу отредактировать сообщение об ошибке, созданное предварительно зарегистрированным валидатором InArray, автоматически добавленным ZF. Я знаю, что могу отключить это поведение, но оно прекрасно работает, кроме сообщений об ошибках. Я попробовал следующее:

$this->getElement('country')->getValidator('InArray')->setMessage('The country is not in the approved lists of countries');

// Doesn't work at all.

$this->getElement('country')->setErrorMessage('The country is not in the approved lists of countries');

// Вызывает конфликт в приложении и не позволяет детально контролировать сообщения об ошибках.

У кого-нибудь есть идеи?

Ben

Ответы [ 3 ]

1 голос
/ 14 октября 2010

Если вы используете Zend_Form_Element_Select (или любой из подклассов Multi), при валидации валидатор InArray будет добавлен автоматически, только если его нет.

Вы можете установить валидатор следующим образом:

$options = array(...);
$this->addElement('select', 'agree', array(
    'validators' => array(
        array('InArray', true, array(
            'messages' => array(
                Zend_Validate_InArray::NOT_IN_ARRAY => 'Custom message here',
             ),
             'haystack' => array_keys($options),
        )),
    'multiOptions' => $options,
));

и тогда ваш валидатор будет использоваться вместо автоматически подключенного.

1 голос
/ 24 августа 2009

Я обычно устанавливаю валидаторы согласно моему примеру ниже:

$this->addElement('text', 'employee_email', array(
            'filters'    => array('StringTrim'),
            'validators' => array(                
                array('Db_NoRecordExists', false, array(
                    'employees',
                    'employee_email',
                    'messages' => array(Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND => 'A user with email address %value% already exists')
                ))
            ),
            'label'     => 'Email address',
            'required'  => true,
            ));

Массив валидаторов в параметрах элемента может принимать имя валидатора (строку) или массив.

Когда передается массив, первое значение - это имя, а третье - массив параметров для валидатора. Вы можете указать ключевые сообщения с пользовательскими сообщениями для вашего элемента в этом массиве опций.

0 голосов
/ 13 января 2010
$el = $this->addElement($name, $label, $require, 'select');

$validator = new Zend_Validate_InArray(array_keys(AZend_Geo::getStatesList()));
$validator->setMessage('Invalid US State.');

$el
->setMultiOptions(AZend_Geo::getStatesList())
->setRegisterInArrayValidator(false)

->addValidator($validator)

->addFilter(new Zend_Filter_StringToUpper())
->addFilter(new T3LeadBody_Filter_SetNull())

->setDescription('US State. 2 char.');
...