Переопределение паттерна валидатора 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 девелоперс.Скажите что всё будет, пожалуйста -)
У меня часто холодными звонками занимаются по брошенным корзинам, и клиенты говорят, что заказ оставляли, и смайлик большой улыбающийся видели. А в админке ничего. Причем, почему-то, только с мобильных. Или просто попадалось так. Попробую ваши правки.