Простая организация глобального модуля расчёта стоимости доставки разными ТК для MS2

По просьбе одного из участников Сообщества приведу пример очень простой реализации расчёта стоимости доставки различными ТК для MS2.
Для кого: это пример расширения MS2 для начинающих разработчиков (если интересно одному, вероятно может пригодиться ещё кому-то в Сообществе).
Зачем: не всегда готовые модули отвечают требованиям заказчика и править несколько отдельных модулей под себя — та ещё морока.

Что мы можем при таком подходе?
Например можно легко реализовать такие требования (примеры реальные):
  • не ограниченное количество служб доставки (я использую одновременно ДЛ, СДЭК, почту, ИМЛ, ПЭК)
  • в зависимости от суммы заказа или веса/габаритов использовать разные службы доставки или только определённые способы
  • Включить сегодня вместо СДЭКа Деловые линии, а на следующий месяц вернуть СДЭК
  • если в корзине есть некий товар — исключить доставку почтой РФ
  • добавить наценку для доставки куда-то или для какого-то товара
Ну и т.д. + отдаём любые комментарии на фронт.

1. Создаём свой класс-обработчик для доставок. Например, тут: msDeliveryHandlerGlobal,
core/components/minishop2/custom/delivery/msdeliveryhandler_global.class.php.
Назначаем его доставкам: prntscr.com/ihnsju

Примерный код класса — см. ссылку ниже (git).
Здесь мы переопределяем стандартный метод msDeliveryHandler таким образом, чтобы иметь возможность делать нужные проверки (см. массив $orderData) и передавать расчёт доставки в свой класс (тут: $DC->run();).
В случае, если нас что-то не устраивает в переданных с фронта данных — отдаём cost = -1 — это маркер для вывода на фронте сообщения об ошибке.

2. Создаём свой класс-обработчик заказа. Например, тут: artlOrderHandler,
core/components/minishop2/custom/order/msorderhandlerCustom.class.php.
Назначаем его доставкам: prntscr.com/iho3lp
Тут у нас переопределён метод getCost() для вывода ошибок:
if($deliveryData['cost'] == -1) {
        return $this->error($deliveryData['message'], array('requires' => $deliveryData['requires']));
}

4. Создаём свой класс, кладём куда угодно (лучше в рамках core), например я создаю категорию core/ext, где храню дополнительные классы.
В этом примере пункты выдачи СДЭК хранятся в отдельной таблицу _sdek_cities; обновляются cron'ом раз в неделю — чтобы не запрашивать их у СДЭКа при каждом расчёте.

Ссылка: https://github.com/MVE-A/Custom-calculation-of-delivery-for-MS2

Внимание! Указанный класс — это просто сокращённый и подчищенный пример, не стоит рассчитывать, что он сразу у вас заработает, нужные методы пишем сами. Смотрите, что отдаёт response в консоли и настраивайте вывод на фронте как удобно.
Алексей Шумаев
21 февраля 2018, 20:38
modx.pro
5
2 194
+6
Поблагодарить автора Отправить деньги

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

Андрей
22 февраля 2018, 09:15
0
Классная вещь! А можно пример таблицы СДЭК и скрипта их обновления посмотреть?
    Алексей Шумаев
    22 февраля 2018, 10:09
    0
    Добавил файлы примера в репу. Скрипт обновления хоть и рабочий, но древний + я его сейчас подчистил, так что он тоже не будет работать прямо с ходу ) Но там всё просто и понятно.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
3