Переопределение паттерна валидатора email Принято

2

Началось всё с того, что клиент пожаловался на невозможность оформления заказа для некоторых валидных и рабочих 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 комментария

  • +2
    Николай Иванов Николай Иванов 26 февраля 2016 13:38 #

    Ай нид фидбэк фром май харт webasyst девелоперс.
    Скажите что всё будет, пожалуйста -)

  • +1
    J. B. diGriz J. B. diGriz 24 февраля 2016 09:54 #

    когда последний раз смотрел, с кастомными валидаторами беда была совсем. Указать его можно было, но там какие-то грабли с сериализацией были, чтоль. А уж подменить штатный я и не мечтал. :-/

  • +1
    Quasar Quasar 2 апреля 2016 16:42 #

    У меня часто холодными звонками занимаются по брошенным корзинам, и клиенты говорят, что заказ оставляли, и смайлик большой улыбающийся видели. А в админке ничего. Причем, почему-то, только с мобильных. Или просто попадалось так. Попробую ваши правки.

    Добавить комментарий

    Чтобы добавить комментарий, зарегистрируйтесь или войдите