Одно сообщение об ошибке вместо нескольких для Zend validator

#php #zend-framework #validation #email

#php #zend-framework #проверка #Адрес электронной почты

Вопрос:

У меня есть следующий элемент:

 $email = new Zend_Form_Element_Text('email');
$email->setAttribs(array('class' => 'input-text', 'id' => 'email'))
        ->setLabel($this->view->translate('Email'))
        ->setValue(null)
        ->setRequired(true)
        ->addValidator(new Zend_Validate_EmailAddress())
        ->setDecorators($emailMessageDecorators);
  

Если в адресе электронной почты более одной ошибки, отображаются некоторые ошибки. Вот так:

 'fff.fgdf' is no valid hostname for email address 'as@fff.fgdf'
'fff.fgdf' appears to be a DNS hostname but cannot match TLD against known list
'fff.fgdf' appears to be a local network name but local network names are not allowed
  

Как я могу установить только 1 сообщение? Я попробовал setMessage (строка), но он показывает 3 одинаковые ошибки. Спасибо. Извините за мой английский. Мир и любовь)

Ответ №1:

В прошлом мне приходилось создавать пользовательский валидатор для этого:

 /**
 * The standard email address validator with a single, simple message
 */
class App_Validate_EmailAddressSimpleMessage extends Zend_Validate_EmailAddress
{
    const COMMON_MESSAGE = 'Invalid email address';

    protected $_messageTemplates = array(
        self::INVALID            => self::COMMON_MESSAGE,
        self::INVALID_FORMAT     => self::COMMON_MESSAGE,
        self::INVALID_HOSTNAME   => self::COMMON_MESSAGE,
        self::INVALID_MX_RECORD  => self::COMMON_MESSAGE,
        self::INVALID_SEGMENT    => self::COMMON_MESSAGE,
        self::DOT_ATOM           => self::COMMON_MESSAGE,
        self::QUOTED_STRING      => self::COMMON_MESSAGE,
        self::INVALID_LOCAL_PART => self::COMMON_MESSAGE,
        self::LENGTH_EXCEEDED    => self::COMMON_MESSAGE,
    );

}
  

Затем вызывается с помощью:

$email->addValidator(new App_Validate_EmailAddressSimpleMessage());

Если вы просто хотите использовать тот же синтаксис, что и обычно:

$email->addValidator('EmailAddress');

но пусть он использует этот валидатор, тогда вы можете изменить classname / filename с EmailAddressSimpleMessage на simply EmailAddress и зарегистрировать префикс App_Validate_ в форме / элементах.

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

Комментарии:

1. Не очень хорошее решение, поскольку существует множество средств проверки, помимо средства проверки адресов электронной почты.

2. Действительно, решение ограничено только Zend_Validate_EmailAddress , что было вопросом OP.

Ответ №2:

Если я правильно помню, вы можете вызвать setErrorMessages (), чтобы установить одно сообщение об ошибке для элемента формы, вместо вызова setMessages () для каждого отдельного средства проверки:

 $form->addElement('password', 'password', array(
    'label' => 'New password:',
    'required' => true,
    'validators' => array(
        array('StringLength', false, 6),
        // more validators
    ),
    'errorMessages' => array('Invalid password.')
));
  

Комментарии:

1. Я это знаю. У меня слишком много валидаторов для моего элемента (NotEmpty и Email). И я хочу получить 2 типа сообщений об ошибках («Требуется значение» и «Неверное электронное письмо»).

Ответ №3:

Это пример (я надеюсь, это поможет) :

 $email = new Zend_Form_Element_Text('emailid');

$email->setLabel("Email-Adress :* ")
      ->setOptions(array('size' => 20))
      ->setRequired(true)
      ->addFilter('StripTags')
      ->addFilter('StringTrim')
      ->addValidator('EmailAddress')
      ->getValidator('EmailAddress')->setMessage("Please enter a valid e-mail address.");
  

Комментарии:

1. нет. Я тоже это сделал. Смотрите мой вопрос. Он отображает 3 одинаковых сообщения.

Ответ №4:

Вот ответ, используя $breakChainOnFailure = true:

 addValidator($nameOrValidator, $breakChainOnFailure = false, array $options = null);
  

Цитируется: http://framework.zend.com/manual/1.12/en/zend.form.elements.html#zend.form.elements.validators.errors

Ответ №5:

Вы используете этот пример:

 $email_validator = new Zend_Validate_EmailAddress();
$email = new Zend_Form_Element_Text('email');
$email->setRequired('true')
      ->setLabel('Email: ')
      ->setDecorators(array(array('ViewHelper'), array('Errors')))
      ->addValidator($email_validator);
  

Комментарии:

1. И что? Ваш ответ бесполезен. Zend_Validate_EmailAddress создает 3 валидатора. И у каждого валидатора есть свои ошибки. И если мы сделаем -> setErrorMessage(‘бла-бла-бла’), это приведет к 3 одинаковым ошибкам.