Переопределение паттерна валидатора email Принято
Началось всё с того, что клиент пожаловался на невозможность оформления заказа для некоторых валидных и рабочих email-ов - валидатор ругается на некорректность.
По его просьбе нужно было выкорчевать валидатор или максимально упросить его. Люди звонят ему, выражают недоумение. В лучшем случае заказ оформляется без email-а, а уведомления и проч. высылается потом отдельным письмом, что конечно же не есть хорошо. В худшем никакого заказа конечно же не происходит.
wa-config/apps/contacts/custom_fileld.php позволяет переопределять поля контакта. В том числе валидатор. Например:
),
'_type' => 'waContactBirthdayField',
)),
16 =>
waContactEmailField::__set_state(array(
'id' => 'email',
'options' =>
array (
'multi' => true,
'storage' => 'email',
'ext' =>
array (
'work' => 'work',
'personal' => 'personal',
),
'top' => true,
'validators' =>
waEmailValidator::__set_state(array(
'options' =>
array (
'required' => false,
'pattern' => '/^[a-z0-9].*\@.*/i',
'multi' => true,
'storage' => 'email',
'ext' =>
array (
'work' => 'work',
'personal' => 'personal',
),
'top' => true,
),
'messages' =>
array (
'required' => 'Это поле обязательное',
'invalid' => 'Неверно',
'not_match' => 'Email-адрес введен неправильно',
),
'errors' =>
array (
),
'_type' => 'waEmailValidator',
)),
'formats' =>
array (
'js' =>
waContactEmailListFormatter::__set_state(array(
'_type' => 'waContactEmailListFormatter',
'options' => NULL,
)),
'top' =>
waContactEmailTopFormatter::__set_state(array(
'_type' => 'waContactEmailTopFormatter',
'options' => NULL,
)),
'html' =>
waContactEmailTopFormatter::__set_state(array(
'_type' => 'waContactEmailTopFormatter',
'options' => NULL,
)),
),
'allow_self_edit' => false,
'required' => false,
'unique' => false,
),
'name' =>
array (
'en_US' => 'Email',
),
'_type' => 'waContactEmailField',
)),
17 =>
waContactPhoneField::__set_state(array(
'id' => 'phone',
'options' =>
По xdebug-у видно, что этот файлик корректно читается, изменения всасываются, но беда в том, что wa-system/validator/waEmailValidator.class.php сделан так:
class waEmailValidator extends waRegexValidator
{
const REGEX_EMAIL = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--(?:--)?)?[a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
protected function init()
{
$this->setMessage('not_match', _ws('Invalid Email'));
$this->setPattern(self::REGEX_EMAIL);
}
$this->init() у waValidator (waEmailValidator->waRegexValidator->waStringValidator->waValidator) вызывается в самом конце __construct и опять переопределяет заданный паттерн на дефолтный.
Я пока приделал костыль в waEmailValidator.class.php в виде
protected function init()
{
$this->setMessage('not_match', _ws('Invalid Email'));
if( $this->getPattern() == '//' ){
$this->setPattern(self::REGEX_EMAIL);
}
}
но хотелось бы доведённого до логичного конца механизма подмены без костылей. /
Например, при сохранении в настройках "оформления заказа" шага контактной информации, шаблон опять перезаписывается этим малопонятным монстром, разбирать который у меня нет никакого желания.
Или, как уже некоторые высказывались - ввести в этот класс параметр отключения валидации, с чекбоксом в тех же настройках магазина шага контактной информации.
Оформлять пулреквест я не стал, так как глубоко зарываться в эту тему некогда, а костыль реквестить смысла нет.
Добавление новых комментариев к этой теме отключено.










3 комментария
когда последний раз смотрел, с кастомными валидаторами беда была совсем. Указать его можно было, но там какие-то грабли с сериализацией были, чтоль. А уж подменить штатный я и не мечтал. :-/
Ай нид фидбэк фром
май хартwebasyst девелоперс.Скажите что всё будет, пожалуйста -)
У меня часто холодными звонками занимаются по брошенным корзинам, и клиенты говорят, что заказ оставляли, и смайлик большой улыбающийся видели. А в админке ничего. Причем, почему-то, только с мобильных. Или просто попадалось так. Попробую ваши правки.