В Zend_Form, как избежать того, чтобы Zend_Validate_Email генерировал несколько ошибок?

Я создаю приложение ZendFramework, которое в качестве формы входа в систему запрашивает адрес электронной почты и пароль - казалось, имеет смысл проверить адрес электронной почты перед попаданием в базу данных с попыткой входа в систему, поскольку недействительный адрес электронной почты никогда не приведет к правильному попаданию. Zend_Validate_EmailAddress кажется правильным путем, но у меня возникла проблема с генерацией нескольких ошибок (вопрос внизу, после кода).

Моя форма в настоящее время имеет следующее

//WPMail_Form_Login::init()
$email = $this->addElement('text', 'email', array(
    'label'=>'Email',
    'required'=>true,
    'filters'=>array('stringtrim'),
    'validators'=>array(array('emailaddress', true, array(
        'messages'=>array(
            'emailAddressInvalidHostname'=>'Your email address is invalid',
            'emailAddressInvalidFormat'=>'Your email address is invalid',
            '...'=>'(repeat for all message templates)'
        )
    ))),
));

В контроллере я напрямую передаю форму в представление:

// WPMail_AuthController::loginAction()
$this->view->form = $form;

И в представлении это прямо эхом:

// views/scripts/auth/login.phtml
<?php echo $this->form ?>

Результат на данный момент примерно такой:

- Your email address is invalid
- 'asda!!!' does not match the expected structure for a DNS hostname
- 'asda!!!' does not appear to be a valid local network name

Что я хочу знать, так это: возможно ли настроить Zend_Validate_EmailAddress таким образом, чтобы он выдавал только одну ошибку недействительного адреса электронной почты? Под «настроить» я имею в виду, не расширяя класс и не переопределяя логику своей собственной.

ТИА.


person kander    schedule 06.08.2009    source источник


Ответы (3)


Zend Form Element имеет различные методы, которые вы можете использовать для настройки сообщений. Из документов не очень ясно, но addErrorMessage() устанавливает одно пользовательское сообщение об ошибке при неудачной проверке.

Таким образом, ваш пример будет выглядеть так:

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email')
      ->setRequired(true)
      ->addFilter('stringtrim')
      ->addValidator('emailAddress', true)
      ->addErrorMessage('Your email address is invalid');
$this->addElement($email);

См. http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.validators.errors

person simonrjones    schedule 08.08.2009
comment
Замечательно, спасибо! Я на самом деле столкнулся с этим, но каким-то образом предположил, что добавление сообщения об ошибке сделает форму недействительной (например, это часть вашей собственной проверки).. рад видеть, что это так просто! - person kander; 09.08.2009
comment
Это может привести к путанице. $email->addError($message) установит ошибку и пометит как недействительную, но $email->addErrorMessage($message) просто появится, чтобы установить сообщение, которое переопределяет сообщения по умолчанию, и не t установить ошибку! - person simonrjones; 09.08.2009

Ознакомьтесь с этим руководство Падраика Брэди по использованию Zend_Form.

В частности, раздел «Шаг 4. Обработка сообщений об ошибках с помощью специального декоратора».

person Bill Karwin    schedule 06.08.2009
comment
Вы имеете в виду использование переводчика на шаге 5, Билл? Это по-прежнему требует нескольких объявлений вашего сообщения по умолчанию для каждого типа ошибки. - person simonrjones; 07.08.2009
comment
Нет, я имею в виду шаг 4. Вы можете написать собственный декоратор ошибок, который возвращает первое сообщение из валидатора электронной почты, как вы хотите, вместо того, чтобы взрывать все сообщения. - person Bill Karwin; 07.08.2009
comment
Отличная ссылка! Похоже, что пользовательские декораторы были бы другим способом (по сравнению с решением simonrjones) получить то, что я хочу, хотя это немного напоминает мне скетч «Охота на комаров» Монти Пайтона... как, вероятно, это немного тяжело для достижения этого , по сравнению с решением Симонрджонса. - person kander; 09.08.2009

Поскольку эти сообщения генерируются одним валидатором, я не думаю, что это возможно :-(

Метод Zend_Validate_EmailAddress::isValid выполняет все проверки, кажется, он генерирует ошибки в целом.

Одним из «хакерских» решений было бы перебирать в вашем контроллере ошибки и удалять все, кроме первого, для каждого поля, которое имеет более одного... Но мне это не очень нравится. звук.. .


Конечно, вы можете наследовать и изменить поведение по умолчанию... Но вы заявили, что не хотите этого делать, так что...


Тем не менее, если я ошибаюсь и есть способ, мне очень любопытно ;-)

person Pascal MARTIN    schedule 06.08.2009
comment
На самом деле сообщения были сгенерированы двумя валидаторами! Zend_Validate_Hostname косвенно вызывался Zend_Validate_Email. - person kander; 12.08.2009