#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 одинаковым ошибкам.