подтверждение по электронной почте формы Zend - PullRequest
8 голосов
/ 17 декабря 2010

У меня есть следующий код для создания поля ввода для адреса электронной почты пользователя

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email:')
    ->addFilters(array('StringTrim', 'StripTags'))
    ->addValidator('EmailAddress')
    ->addValidator(new Zend_Validate_Db_NoRecordExists(
                                                        array(
                                                                'adapter'=>Zend_Registry::get('user_db'),
                                                                'field'=>'email',
                                                                'table'=>'tbl_user'
                                                                )))
    ->setRequired(true)
    ->setDecorators(array(
                            array('Label', array('escape'=>false, 'placement'=>'append')),
                            array('ViewHelper'),
                            array('Errors'),
                            array('Description',array('escape'=>false,'tag'=>'div')),
                            array('HtmlTag', array('tag' => 'div')),
                        ));
$this->addElement($email);

Теперь проблема в том, что если пользователь вводит неверное имя хоста для электронной почты, он генерирует 3 ошибки.скажем, пользователь вводит 'admin @ l' в качестве адреса электронной почты, и ошибки будут
* 'l' не является допустимым именем хоста для адреса электронной почты 'admin @ l'
* 'l' не соответствует ожидаемой структуредля имени хоста DNS
* 'l' представляется именем локальной сети, но имена локальной сети не допускаются

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

Ответы [ 5 ]

8 голосов
/ 29 марта 2011

Ну, это поздний ответ, но я думаю, что он всегда полезен.

Просто добавьте true в качестве второго параметра addValidator ()

Из документов Zend (http://framework.zend.com/apidoc/1.8/):

addValidator (строка 67)

Добавляет валидатор в конец цепочки

Если значение $ breakChainOnFailure равно true, тогда еслиСбой валидатора, следующий валидатор в цепочке, если таковой существует, не будет выполнен.

return: Обеспечивает свободный интерфейс

доступ: общедоступный

Вот подпись:

Zend_Validate addValidator (Zend_Validate_Interface $validator, [boolean $breakChainOnFailure = false])

Zend_Validate_Interface $validator
boolean $breakChainOnFailure

Итак, код:

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email:')
    ->addFilters(array('StringTrim', 'StripTags'))
    ->addValidator('EmailAddress',  TRUE  ) // added true here
    ->addValidator(new Zend_Validate_Db_NoRecordExists(
                array(
                        'adapter'=>Zend_Registry::get('user_db'),
                        'field'=>'email',
                        'table'=>'tbl_user'
                        ), TRUE )
            );
5 голосов
/ 26 июня 2011

Вы должны создать экземпляр класса Zend_Validate_EmailAddress и вызвать метод setMessages, а затем переопределить сообщения, которые вам нравятся, чтобы удалить те, о которых вы упоминаете, что-то вроде этого:

$emailValidator->setMessages(array(
    Zend_Validate_EmailAddress::INVALID_FORMAT => "Your error message",
    Zend_Validate_Hostname::INVALID_HOSTNAME => "Your error message",
    Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED => "Your error message"
));

Надеюсь, это поможет кому-нибудь: -)

2 голосов
/ 21 декабря 2010
$email->addErrorMessage("Please Enter Valid Email Address");

вы можете использовать пользовательский валидатор.создайте файл Email.php внутри папки Проверьте в папке library в корне проекта

class Validate_Email extends Zend_Validate_Abstract
{

    const INVALID = 'Email is required';
    protected $_messageTemplates = array(
    self::INVALID => "Invalid Email Address",
    self::ALREADYUSED => "Email is already registered"
    );

     public function isValid($value)
     {
          if(preg_match($email_regex, trim($value))){
            $dataModel = new Application_Model_Data(); //check if the email exists
            if(!$dataModel->email_exists($value)){
                return true;
            }
            else{
                $this->_error(self::ALREADYUSED);
                return false;
            }
          }
          else
          {
            $this->_error(self::INVALID);
            return false;
          }
     }
}

и в вас form.php file

    $mailValidator = new Validate_Email();
    $email->addValidator($mailValidator, true);

Не знаю, работает это или нет, но для меня это работало в случае телефона.Предоставлено http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/

0 голосов
/ 15 января 2012

Использование пользовательского валидатора - единственный способ избежать этой проблемы.

Если вы хотите:

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

Тогда я предлагаю вам сделать что-то вроде этого:

$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, чтобы вы могли отображать свои собственные сообщения независимо от формы, над которой вы работаете.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 26 января 2011

Кажется, что пропущено довольно много строк ...

, вероятно, следует использовать это: $ mailValidator = new Zend_Validate_EmailAddress ();

вы также можете выполнить некоторые другие проверки, см. Здесь:http://framework.zend.com/manual/en/zend.validate.set.html

...