Zend-форма показывает все ошибки / Zend-форма показывает ошибку над каждым полем ввода - PullRequest
1 голос
/ 11 февраля 2011

Для формы я использую следующий код:

class Application_Form_User_Register extends Zend_Form 
{
     public function init() 
     {
        $email = new Zend_Form_Element_Text('email');
        $email->setLabel('Email adres: (*)')
        ->setRequired(true)
        ->addErrorMessage('Het veld Email adres is verplicht')
        ->addValidator('StringLength', false,array(6,100))
        ->addErrorMessage('Het email adres dient uit minstens 6 karakters te bestaan')
        ->addValidator('EmailAddress')
        ->addErrorMessage('Het veld Email adres moet een geldig email adres bevatten')
        ->addFilter('StringTrim');
        $this->addElement($email);
    }
}

Когда я отправляю неправильный адрес электронной почты из этой формы, он показывает все 3 сообщения об ошибках.

Например: если я отправляю "thisisa @ nonvalidadress", отображаются все ошибки, включая ошибку "Адрес электронной почты должен быть длиной не менее 6 символов".

Есть ли способ изменитьэто поведение?

Тогда второй вопрос ... Есть ли способ показать сообщение об ошибке над соответствующим полем ввода?По умолчанию сообщение об ошибке отображается под.

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Первый вопрос был дан ответ.Второй должен быть как-то по этой линии:

$element->getDecorator('Errors')->setPlacement('prepend');
1 голос
/ 12 февраля 2011

Судол прав насчет передачи параметра breakChainOnFailure в случае, если вы хотите остановить проверки после первого сбоя.

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

Итак, вам нужно указать сообщения об ошибках для каждого валидатора вместо элемента.

$emailValidator = new Zend_Validate_EmailAddress();
$emailValidator->setMessage( 'Het veld Email adres moet een geldig email adres bevatten' );

$email->addValidator( $emailValidator );

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

1 голос
/ 12 февраля 2011

Вторым параметром метода addValidator () является метакоманда breakChainOnFailure.Просто установите значение true.Таким образом, вы будете делать

class Application_Form_User_Register extends Zend_Form 
{
 public function init() 
 {
    $email = new Zend_Form_Element_Text('email');
    $email->setLabel('Email adres: (*)')
    ->setRequired(true)
    //->addErrorMessage('Het veld Email adres is verplicht')
    ->addValidator('StringLength', true, array(6,100))
    //->addErrorMessage('Het email adres dient uit minstens 6 karakters te bestaan')
    ->addValidator('EmailAddress', true)
    //->addErrorMessage('Het veld Email adres moet een geldig email adres bevatten')
    ->addFilter('StringTrim');
    $this->addElement($email);
}

}

Это приведет к разрыву цепочки валидатора в случае его сбоя.

Вот что говорит веб-сайт Zend Framework о пользовательских сообщениях валидатора:

Примечание. Предоставление пользовательских сообщений об ошибках валидатора Некоторые разработчики могут захотеть предоставить собственные сообщения об ошибках для валидатора.Аргумент $ options метода Zend_Form_Element :: addValidator () позволяет сделать это, предоставив ключ 'messages' и сопоставив его с массивом пар ключ / значение для установки шаблонов сообщений.Вам нужно будет знать коды ошибок различных типов ошибок валидации для конкретного валидатора.Лучший вариант - использовать Zend_Translate_Adapter с вашей формой.Коды ошибок автоматически передаются адаптеру декоратором ошибок по умолчанию;затем вы можете указать свои собственные строки сообщений об ошибках, настроив переводы для различных кодов ошибок ваших валидаторов.

Подробнее см. Здесь: http://framework.zend.com/manual/en/zend.form.elements.html

Ваш второй вопрос, изменяющий место появления сообщения об ошибке, требует настройки декораторов для этих элементов формы.Вы определенно можете это сделать, и это не так сложно, как кажется на первый взгляд.Эта статья действительно помогла мне понять декораторы: http://devzone.zend.com/article/3450

...