Плагин для пересчета стоимости доставки в админке

Всем привет!
Так как в miniShop2, к сожалению по прежнему нет пересчета доставки в админке, приходится из раза в раз что-то придумывать.
Какие решения я пока нашел:
  1. Полностью создать новый заказ через фронт — самый легкий способ, который всё пересчитает как надо, проблема только в том, что нужно заново набрать корзину с теми же параметрами, что у клиента, выбрать способ доставки с теми же параметрами, что у клиента и наконец выбрать способ оплаты
    Плюсы: охватываем даже сложные способы доставки с динамическим расчетом через всякие API
    Минусы: повторять весь процесс формирования заказа
  2. Сделать плагин на событие обновления заказа, чтобы он пересчитывал стоимость доставки, тут проблема в том, что в плагине уже нет объекта корзины, но, что мешает его создать на основании заказа. Я нашел среди issues минишопа одно решение (Код ниже), которое по идее должно решить этот вопрос хотя бы для простых способов доставки, у которых фиксированы доп. стоимость и стоимость при которой доставка бесплатная. Но проблема в том, что плагин почему-то считает не корректно, возможно из-за того, что он написан в 2015, а минишоп недавно прилично так обновился и с этим могут быть связаны проблемы. Собственно нужна помощь сообщества, чтобы его поправить.
  3. Ну и третий способ, правим исходники минишопа и делаем все поля заказа редактируемыми, таким образом решая все возможные проблемы с пост-обработкой заказа в админке. Да в таком случае менеджер может насчитать что и как угодно, но это уже проблема магазина и ответственности менеджера. Единственное, что при таком способе хорошо бы делать — это вносить все изменения в историю заказа, так можно будет произвести разбор полетов в случае чего.

В сообществе нашел несколько топиков на эту тему, но в половине уже нет рабочих ссылок на исходный код, в половине капитальные правки в исходниках.
Код плагина: (Который пока не хочет работать как надо)
<?php
switch ($modx->event->name) {
    case 'msOnBeforeUpdateOrder':
        $originalContext = $object->xpdo->context->get('key');
        $object->xpdo->switchContext($object->get('context'));
        $originalMiniShop = isset($object->xpdo->services['minishop2']) ? $object->xpdo->services['minishop2'] : null;
        $cart             = array();
        foreach ($object->getMany('Products') as $product) {
            $product = array(
                'id' => $product->get('product_id'),
                'price' => $product->get('price'),
                'weight' => $product->get('weight'),
                'count' => $product->get('count'),
                'options' => $object->xpdo->fromJSON($product->get('options')),
                'ctx' => $object->get('context')
            );
            if (!is_array($product['options'])) {
                $product['options'] = array();
            }
            $cart[md5($product['id'] . $product['price'] . $product['weight'] . $object->xpdo->toJSON($product['options']))] = $product;
        }
        $address   = $object->getOne('Address');
        /**
         * @var miniShop2 $miniShop2
         */
        $miniShop2 = $object->xpdo->services['minishop2'] = new miniShop2($object->xpdo, array(
            'cart' => $cart,
            'order' => array_merge($address ? $address->toArray() : array(), $object->toArray())
        ));
        $miniShop2->initialize($object->get('context'));
        $cartStatus   = $miniShop2->cart->status();
        $deliveryCost = $miniShop2->order->getCost(false, true);
        $object->fromArray(array(
            'cart_cost' => $cartStatus['total_cost'],
            'weight' => $cartStatus['total_weight'],
            'delivery_cost' => $deliveryCost,
            'cost' => $cartStatus['total_cost'] + $deliveryCost
        ));
        $object->xpdo->services['minishop2'] = $originalMiniShop;
        $object->xpdo->switchContext($originalContext);

        return true;

        break;
}
Прошу знатоков сообщества помочь с решением или поделиться своим.
Семён Кудрявцев
12 марта 2021, 12:09
modx.pro
585
0

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0