В Zend_Form, как избежать Zend_Validate_Email от создания нескольких ошибок? - PullRequest
9 голосов
/ 06 августа 2009

Я создаю приложение 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 таким образом, чтобы он выдавал только одну недействительную ошибку электронной почты? Под «настройкой» я подразумеваю, не расширяя класс и не переопределяя логику своей собственной.

ТИА.

Ответы [ 3 ]

10 голосов
/ 08 августа 2009

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

3 голосов
/ 06 августа 2009

Ознакомьтесь с этим учебным пособием от Pádraic Brady по использованию Zend_Form.

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

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

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

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

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


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


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

...