Стоимость доставки отдельной строкой в оформление заказа MS2
На заметку.
Делаем колбеки miniShop2 для всех
Хочу сразу отметить, что решение уже есть в просторах сообщества MS, хочется расставить акценты и более краткой форме поделиться с решением данной проблемы.
Итак, приступим.
Сначала расширим класс msOrderHandler назовем его customOrderInterface
Далее добавим в шаблон JS файл и назовем его ms2.js он должен быть последним
UPD 03.11.2019
Поработаем с массивом сниппета msOrder
Добавим в словарь MS2
ms2_frontend_total_cost
ms2_delivery_cost
Далее в чанк добавим tpl.msOrder (как правило мы называем чанк на свое усмотрение)
Вот и результат.
Делаем колбеки miniShop2 для всех
Хочу сразу отметить, что решение уже есть в просторах сообщества MS, хочется расставить акценты и более краткой форме поделиться с решением данной проблемы.
Итак, приступим.
Сначала расширим класс msOrderHandler назовем его customOrderInterface
<?php
if(!class_exists('msOrderInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php';
}
class customOrderInterface extends msOrderHandler {
/**
* @param array $data
*
* @return array|string
*/
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));
}
}
Зарегистрируем его в настройках MS2 Далее добавим в шаблон JS файл и назовем его ms2.js он должен быть последним
UPD 03.11.2019
miniShop2.Order.deliveryCost = '#ms2_delivery_cost';
miniShop2.Callbacks.add('Order.getcost.response.success','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.add('Order.getcost.response.error', '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.add('Order.add.response.success', 'add_response_success' , function(response) {
miniShop2.Order.getcost();
});
Поработаем с массивом сниппета msOrder
$cart = $miniShop2->cart->get();
$order = $miniShop2->order->get();
$status = $miniShop2->cart->status();
if (empty($status['total_count'])) {
return '';
}
$cost = $miniShop2->order->getCost();
$order['cost'] = $miniShop2->formatPrice($cost['data']['cost']);
...
$status['total_cost'] = $miniShop2->formatPrice($status['total_cost']); // делитель
...
$output = $pdoFetch->getChunk($tpl, array(
'order' => $order,
'status' => $status, // добавим нужные данные
'form' => $form,
'deliveries' => $deliveries,
'payments' => $payments,
'errors' => $errors,
));
...
Добавим в словарь MS2
ms2_frontend_total_cost
ms2_delivery_cost
Далее в чанк добавим tpl.msOrder (как правило мы называем чанк на свое усмотрение)
<div class="d-flex flex-column flex-md-row align-items-center justify-content-center justify-content-md-start">
<h6 class="mb-md-0 font-weight-bold">{'ms2_frontend_total_cost' | lexicon}:</h6>
<h6 class="mb-md-0 ml-md-2"><span>{$status.total_cost ?: 0}</span> {'ms2_frontend_currency' | lexicon}</h6>
</div>
<div class="d-flex flex-column flex-md-row align-items-center justify-content-center justify-content-md-start">
<h6 class="mb-md-0 font-weight-bold">Стоимость доставки</h6>
<h6 class="mb-md-0 ml-md-2"><span id="ms2_delivery_cost">0</span> {'ms2_frontend_currency' | lexicon}</h6>
</div>
<div class="d-flex flex-column flex-md-row align-items-center justify-content-center justify-content-md-start">
<h6 class="mb-md-0 font-weight-bold">{'ms2_frontend_order_cost' | lexicon}:</h6>
<h6 class="mb-md-0 ml-md-2"><span id="ms2_order_cost">{$order.cost ?: 0}</span> {'ms2_frontend_currency' | lexicon}</h6>
</div>
Вот и результат.
Поблагодарить автора
Отправить деньги
Комментарии: 8
Для тех, кто только начинает работать с MS2 (особенно, если не читать документацию) — будет весьма кстати.
Тож смотрю, вроде прямо это в доках есть. Но за статью + однозначно
miniShop2.Callbacks.Order.getcost.response.successЧёрт возьми! А я то думаю, кто вот такую дрянь уже на котором клиентском сайте делает! Блин, ну есть же дока, что вы творите?!
miniShop2.Callbacks.Order.getcost.response.error
miniShop2.Callbacks.Order.add.response.success
Никогда так не делайте!
Это т.н. старый способ, минус его в том, что он затирает вообще все правки на данные колбэки, которые были сделаны до него по нормальному, методами miniShop2.Callbacks[add/remove]. И кажется затирает все правки и после него…
P.S.: Плюсанул раньше, чем дошёл до этого момента. Теперь минус ставить не хочется. Прошу исправить этот косяк в коде!
Видел именно данный вызов. Его много кто цитировал. Действительно все сообщения упоменающие данное решение старые. Сейчас осмыслю документацию и переделаю. Возможно это займет время, но обновление посты с исправления замечаний будет.
Внес изменение в JS согласно документации. Спасибо!
Автор, спасибо!
есть много простых вещей, которые нигде не описаны, и приходится на них тратить кучу времени, хотя нужны постоянно.
есть много простых вещей, которые нигде не описаны, и приходится на них тратить кучу времени, хотя нужны постоянно.
Deleted…
/** @var msDelivery $delivery */А что если в методе msDeliveryHandler::getCost стоимость доставки зависит от стоимости заказа во втором переданном параметре $cost? А вы туда «0» передаёте. Следовательно ваша стоимость доставки будет одна, а по сути — другая. Надо делать как-то так:
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 msDelivery $delivery */
if (!empty($this->order['delivery']) && $delivery = $this->modx->getObject('msDelivery',
$this->order['delivery'])
) {
$cost_old = $cost;
$cost = $delivery->getCost($this, $cost);
$delivery_cost = $cost - $cost_old;
unset($cost_old);
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.