Использование пользовательского валидатора - единственный способ избежать этой проблемы.
Если вы хотите:
- Наличие только одного сообщения об ошибке, если адрес электронной почты имеет неправильный формат
- Если формат хороший, проверьте, есть ли адрес электронной почты в базе данных
Тогда я предлагаю вам сделать что-то вроде этого:
$where = array('users', 'email', array('field' => 'user_id',
'value' => $this->getAttrib('user_id')));
$email = new Zend_Form_Element_Text('email');
$email->setLabel('E-mail:')
->setRequired(true)
->setAttrib('required name', 'email') // html5
->setAttrib('maxlength', '50')
->addFilter('StripTags')
->addFilter('StringTrim')
->addFilter('StringToLower')
->addValidator('email', true)
->addValidator('stringLength', true, array(1, 50))
->addValidator('db_NoRecordExists', true, $where)
->addDecorators($this->_elementDecorators);
$this->addElement($email);
$this->getAttrib('user_id')
представляет идентификатор текущего пользователя .
Здесь есть три валидатора, каждый из них имеет свой второй параметр $breakOnFailure
, установленный на false
, поэтому, если валидатор выйдет из строя, остальные не будут вызваны.
Первый валидатор - email , который является моим собственным валидатором:
class My_Validate_Email extends Zend_Validate_EmailAddress
{
public function getMessages()
{
return array('invalidEmail' => 'Your email address is not valid.');
}
}
Вы можете добавить этот валидатор в свою библиотеку, например, в / application / library / My / Validate, а затем добавить
$this->addElementPrefixPath('My_Validate', 'My/Validate', 'validator');
в вашу форму. Конечно, вам нужно заменить «My» на имя вашей библиотеки.
Теперь, если электронная почта имеет неправильный формат, она всегда будет отображать «Ваш адрес электронной почты недействителен». Если ваша электронная почта слишком длинная и не помещается в поле вашей базы данных (например, VARCHAR (100)), она покажет ваши ошибки валидатора stringLength, а в последнем случае, если запись уже существует в базе данных, только эта ошибка будет показана.
Конечно, вы можете добавить больше методов в свой пользовательский валидатор и перегрузить setMessages, чтобы вы могли отображать свои собственные сообщения независимо от формы, над которой вы работаете.
Надеюсь, это кому-нибудь поможет!