Вывод стоимости доставки в minishop2 на Modx Revolution
Добрый день. Я столкнулся с проблемой вывода стоимости доставки в чанке tpl.msOrder при создании интернет-магазина на minishop2 в Modx Revolution. Нашёл решение и хочу им с вами поделиться, да и просто для себя выложить, чтобы не забыть.
Так вот, чтобы вывести стоимость доставки для начала нужно подключить скрипт после </body>
<script> miniShop2.Order.deliveryCost = '#ms2_delivery_cost'; miniShop2.Callbacks.Order.getcost.response.success = function(response) { var rdc = response.data['delivery_cost']; if(rdc) $(miniShop2.Order.deliveryCost, miniShop2.Order.order).text(miniShop2.Utils.formatPrice(rdc)); else $(miniShop2.Order.deliveryCost, miniShop2.Order.order).text('0'); } miniShop2.Callbacks.Order.getcost.response.error = function(response) { var cost = response.data['cost']; $(miniShop2.Order.orderCost).text(miniShop2.Utils.formatPrice(cost)); $(miniShop2.Order.deliveryCost, miniShop2.Order.order).text('0'); } miniShop2.Callbacks.Order.add.response.success = function(response) { miniShop2.Order.getcost(); } </script>
Подключаем именно после закрытия для того, чтобы точно запустить скрипт после скрипта minshop2
Далее идем в components/minishop2/custom/order и создаем там файл mscustomorderhandler.class.php с кодом
<?php if(!class_exists('msOrderInterface')) { require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php'; } class detaliOrderHandler extends msOrderHandler implements msOrderInterface { public function getCost($with_cart = true, $only_cost = false) { $response = $this->ms2->invokeEvent('msOnBeforeGetOrderCost', array( 'order' => $this, 'cart' => $this->ms2->cart, 'with_cart' => $with_cart, 'only_cost' => $only_cost, )); if (!$response['success']) { return $this->error($response['message']); } $cart = $this->ms2->cart->status(); $cost = $with_cart ? $cart['total_cost'] : 0; /** @var msDelivery $delivery */ if (!empty($this->order['delivery']) && $delivery = $this->modx->getObject('msDelivery', $this->order['delivery']) ) { $cost = $delivery->getCost($this, $cost); $deliveryCost = $delivery->getCost($this, 0);//Добавил переменную где получаем price доставки } /** @var msPayment $payment */ if (!empty($this->order['payment']) && $payment = $this->modx->getObject('msPayment', $this->order['payment']) ) { $cost = $payment->getCost($this, $cost); } $response = $this->ms2->invokeEvent('msOnGetOrderCost', array( 'order' => $this, 'cart' => $this->ms2->cart, 'with_cart' => $with_cart, 'only_cost' => $only_cost, 'cost' => $cost, )); if (!$response['success']) { return $this->error($response['message']); } $cost = $response['data']['cost']; return $only_cost ? $cost : $this->success('', array('cost' => $cost, 'delivery_cost'=>$deliveryCost)); } }
Регистрируем плагин, выполнив в Concole код
<?php if ($miniShop2 = $modx->getService('miniShop2')) { $miniShop2->addService('order', 'detaliOrderHandler', '{core_path}components/minishop2/custom/order/mscustomorderhandler.class.php' ); }
Если вы не знаете что такое Concole
Concole, это дополнение, которое нужно скачать и установить, затем перейти в Пакеты/Concole, вставить вышеуказанный код и нажать "Выполнить"
Затем идем в Системные настройки/События и присваиваем ключу ms2_order_handler_class значение detaliOrderHandler.
Ну и осталось просто вывести переменную стоиомости доставки
Стоимость доставки: <span id="ms2_delivery_cost"></span> руб.
Если вы всё сделали правильно, то должна выводить стоимость доставки, которую вы указали в настройках minishop2 в раздели "Способы доставки". Стоимость будет менятся без перезагрузки страницы, если вы будет переключаться между доставками с разной стоимостью.
Комментарии ()