[miniShop2] Версия 2.4.15

Новая версия miniShop2 — основное изменение затрагивает работу с пользователем заказа, поле ПОЧТА становится НЕ ОБЯЗАТЕЛЬНЫМ!

В последнее время в моду вошла авторизация по номеру телефона, что потребовало внести коррективы в код магазина.
НЕ ОБНОВЛЯЙТЕ РАБОЧИЕ МАГАЗИНЫ, ПОКА НЕ ПРОЧИТАЕТЕ ЭТУ ЗАМЕТКУ ЦЕЛИКОМ!!!
— поле email
Удалено из обязательных. Если ранее в классе заказа было жестко прописано наличие почты, то теперь нет.
Рабочие магазины где необходимо указание почты — проверяйте наличие поля email в способах доставки.



— метод getCustomerId
Изменен, прежде он возвращал идентификатор пользователя только по почте, теперь и по номеру телефона.
Указание email стало необязательным, можно создать заказ только с указанием номера телефона, либо вообще без телефона и почты. Все зависит от логики вашего магазина и настройки обязательных полей способа доставки.

— события msOnBeforeGetOrderCustomer, msOnGetOrderCustomer
Добавлены события на получение пользователя заказа. Теперь вы можете стоить свою логику по созданию
/ получению пользователя в своем плагине.

Например, если не указана почта запишем заказ на пользователя с идентификатором 1
if ($modx->event->name !== 'msOnBeforeGetOrderCustomer') {
    return;
}

$data = $order->get();
if (empty($data['email'])) {
    $scriptProperties['customer'] = $modx->getObject('modUser', 1);
}

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

— события miniShop
Все события магазина задокументированы docs.modx.pro/components/minishop2/development/events
Надеюсь теперь писать свои плагины будет еще проще.

— Итог
Вообщем теперь создание заказов и авторизация по телефону работают из коробки. Вам нужно лишь обновить магазин до текущей версии.

Так же не забываем про формат номера телефона, вам нужно обеспечить ввод номера в том виде что у вас хранится в БД для корректной авторизации после посредством js, либо например с помощью плагина на событие msOnValidateOrderValue, пример для номера в РФ

<?php
if (!function_exists('check_phone')) {
    function check_phone($phone)
    {
        $phone = preg_replace('#[^0-9]#', '', $phone);
        if (strlen($phone) == 10) {
            $phone = '7' . $phone;
        } else if (strlen($phone) == 11 AND substr($phone, 0, 1) == 8) {
            $phone = '7' . substr($phone, 1);
        }
        if (!is_numeric($phone) || strlen($phone) < 11) {
            return false;
        }

        return $phone;
    }
}

if ($key === 'phone') {
    $modx->event->returnedValues['value'] = check_phone($value);
}

НЕ ОБНОВЛЯЙТЕ РАБОЧИЕ МАГАЗИНЫ, ПОКА НЕ ПРОЧИТАЕТЕ ЭТУ ЗАМЕТКУ ЦЕЛИКОМ!!!
Поле email — удалено из обязательных. Если ранее в классе заказа было жестко прописано наличие почты, то теперь нет. Проверяйте наличие поля email в способах доставки.
Володя
06 августа 2018, 12:42
modx.pro
6
3 499
+18
Поблагодарить автора Отправить деньги

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

Андрей Степаненко
06 августа 2018, 12:51
1
+2
3 дня назад доработал приложение msOneClick для исправления этого недуга.

Не обязательное поле email

Если сделать поле email не обязательным и при отправке поле оказывается пустым, то minishop не даст создать заказа.
Для этого была добавлена дополнительная возможность для автоматической генерации нового email адреса. Либо можно указать свой email адрес на который будут создаваться все заказа.
    Андрей
    06 августа 2018, 13:23
    0
    Я правильно понимаю, что теперь можно сделать заказ не создавая пользователя?
      Володя
      06 августа 2018, 13:25
      0
      нет, пользователь в любом случае создается.
        Андрей
        06 августа 2018, 13:29
        0
        Эх жаль, просто на зарубежных сайтах нужна возможность сделать заказ как гость не регистрируя пользователя.
          Володя
          06 августа 2018, 13:33
          +2
          — события msOnBeforeGetOrderCustomer, msOnGetOrderCustomer
          не вижу проблем, создаете пользователя гость и по вашей логике регаете все нужные заказы на него.
            Андрей
            09 августа 2018, 08:33
            0
            Допустим, но почта же берется из пользователя все равно, а не из заказа, для отправки писем о заказе и смене статуса. Т.е. получится что нельзя будет отсылать такому пользователю письмо, если после него еще кто-нибудь как гость заказал? Почта у него перезапишется на другую.
              Володя
              09 августа 2018, 09:59
              0
              Допустим, но почта же берется из пользователя все равно, а не из заказа, для отправки писем о заказе и смене статуса. Т.е. получится что нельзя будет отсылать такому пользователю письмо, если после него еще кто-нибудь как гость заказал?
              ну наверно тогда вам все же стоит регать пользователя и использовать штатный механизм оповещения.
              Либо строить свой механизм оповещений изменив например метод changeOrderStatus.
      Наумов Алексей
      06 августа 2018, 13:45
      0
      Формат телефона 79990000000 строго обязателен? Что для зарубежных пользователей?
        Володя
        06 августа 2018, 13:52
        0
        нет, конечно. Данный случай описан для магазина в РФ. Главное привести номер к единому виду.
        Поправил в заметке, спасибо!
        mngatoff
        06 августа 2018, 14:18
        0
        Все события магазина задокументированы
        хорошо бы еще документацию касательно работы с returnedValues
        Boris Akimenko
        06 августа 2018, 19:03
        +2
        Спасибо, Ребята!
        Отличная работа!
          Володя
          07 августа 2018, 08:17
          +1
          Пожалуйста!
          Димыч
          11 августа 2018, 22:13
          0
          Могло ли обновление как-то нарушить работу с thumbnails?
          В источнике файлов есть строка «catalog»:{«w»:480,«h»:612,«q»:95,«far»:«1»,«bg»:«ffffff»}
          При выводе каталога через tpl.msProducts.cell изображения выводятся через {$catalog}. Ранее все нормально работало, сейчас в $catalog — пустая строка. Если ставить $thumb, то фото выводятся.
          Логи пустые.
            Володя
            12 августа 2018, 08:32
            0
            нет
              Димыч
              12 августа 2018, 20:41
              0
              Спасибо, разобрался.
              Почему-то ранее msProduct выводил изображения без указания &includeThumbs=`...` (чего быть не должно по документации). Как поставил &includeThumbs — все заработало.
                Алексей Суслов
                14 августа 2018, 14:26
                0
                Скорей всего у вас были изменены параметры сниппета по умолчанию, после обновления они затерлись.
                Можете изменить снова и тогда будет опять без параметра по умолчанию работать.

            Александр
            14 октября 2018, 14:49
            0
            Правильно ли я понимаю, что без указания email теперь создаётся пользователем с email в формате receiver@domain.ru, где receiver — введенное имя пользователя, а domain.ru — домен сайта. И в этого пользователя записывается номер телефона в поле mobilephone.
            Но! При создании нового заказа с тем же именем (receiver), но другим номером телефона, новый пользователь не создаётся, а заказ присваивается на предыдущего пользователя!
            К тому же, поскольку у пользователя есть email, то система пытается его отправить. На несуществующий email собственного домена.
              Александр
              22 февраля 2019, 20:55
              0
              Странно работает валидация как-то. В методе validate() сначала вызывается событие msOnBeforeValidateOrderValue, потом идёт встроенная в метод валидация полученного из события значения, далее вызывается событие msOnValidateOrderValue с новым (после валидации) значением, старое значение, до встроенной в метод валидации в это событие не передаётся, т.е. значение поля телефон, например, всегда будет обрезаться до 15 символов.
                Сuriosity
                15 августа 2019, 19:27
                0
                Володя, пожалуйста, помогите.
                Безвозвратно очищается корзина при выходе из личного кабинета
                P.S.
                И не Володя тоже.
                  Игорь Терентьев
                  15 ноября 2021, 20:49
                  0
                  @Володя Что-то ни в какую не получается передать customer через плагин на событие msOnBeforeGetOrderCustomer. Оба способа не работают:
                  $scriptProperties['customer'] = $modx->getObject('modUser', 1);
                  $modx->event->returnedValues['customer'] = $modx->getObject('modUser', 1);
                  В плагине объект пользователя точно есть, а в классе минишопа, после вызова события — пусто.

                  Где-то тут github.com/Ibochkarev/miniShop2/blob/master/core/components/minishop2/model/minishop2/minishop2.class.php#L657 разве не должно быть:
                  $customer = $response['customer']
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    22