Сообщения не работают на Zend_Form_Element_Text - PullRequest
0 голосов
/ 14 сентября 2011

В форме у меня есть следующий элемент:

    $email = new Zend_Form_Element_Text('username');
            $email
                    ->setLabel($this->getView()->l('E-mail'))
                    ->setRequired(TRUE)
                    ->addValidator('EmailAddress')
                    ->addValidator('Db_NoRecordExists', true,
                            array(
                                'table' => 'pf_user',
                                'field' => 'email',
                                'messages' => array(
                                    'recordFound' => 'This username is already registered',
                                )
                    ))
                    ->setErrorMessages(array(
                        'emailAddressInvalidFormat' => 'You must enter a valid e-mail',
                        'isEmpty' => 'You must enter an e-mail',
                        'recordFound' => 'This e-mail has already registered in out database'
                    ));
$form->addElement($email)

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

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

На самом деле, вы делаете следующее:

  1. Вы устанавливаете ошибки для элемента
  2. Зенд теперь думает, что элемент не прошел проверку корректно и что первыйошибка: «Вы должны ввести действительный адрес электронной почты»
  3. Когда вы отображаете форму, так как вы устанавливаете ошибки, Zend найдет их и отобразит первую найденную.Если вы измените порядок, то обнаружите, что любая ошибка, которую вы поставили сверху, будет ошибкой, которую вы получите.

Более правильный способ - установить пользовательские сообщения в валидаторе.При вызове валидаторов для проверки элемента, если проверка не удалась, валидатор вызовет setErrorMessages для элемента, чтобы установить пользовательские ошибки, которые вы укажете.Используйте этот тип кода ниже для установки своих пользовательских сообщений.

$element->addValidator( array( 'Db_NoRecordExists', true, array( 
'messages' = array(
Zend_Validate_Db_Abstract::ERROR_NO_RECORD_FOUND => 'Myy custom no error record',
Zend_Validate_Db_Abstract::ERROR_RECORD_FOUND    => 'My custom record error'
)
) ) );

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

0 голосов
/ 14 сентября 2011

По сути, передавая 'true' в качестве второго параметра addValidator(), вы говорите, что валидатор разрывает цепочку всякий раз, когда валидатор терпит неудачу.Поскольку "" не является действительным адресом электронной почты, следовательно, первый валидатор электронной почты не работает и разрывает цепочку

Из Zend Doc http://framework.zend.com/manual/en/zend.validate.validator_chains.html

В некоторых случаях имеет смысл иметь валидаторразорвать цепочку, если процесс проверки не пройден.Zend_Validate поддерживает такие варианты использования со вторым параметром метода addValidator ().Установив для $ breakChainOnFailure значение TRUE, добавленный валидатор прервет выполнение цепочки при сбое, что позволит избежать запуска любых других валидаций, которые определены как ненужные или неподходящие для ситуации.Если приведенный выше пример был написан следующим образом, буквенно-цифровая проверка не произойдет, если проверка длины строки не удалась:

$validatorChain->addValidator(
                    new Zend_Validate_StringLength(array('min' => 6,
                                                         'max' => 12)),
                    true)
               ->addValidator(new Zend_Validate_Alnum());
...