Вывод стоимости доставки в 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 в раздели "Способы доставки". Стоимость будет менятся без перезагрузки страницы, если вы будет переключаться между доставками с разной стоимостью.




Комментарии ()