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