Стоимость доставки отдельной строкой в оформление заказа MS2

На заметку.

Делаем колбеки 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>

Вот и результат.

Олег Щавелев
02 декабря 2019, 03:01
modx.pro
14
3 091
+16
Поблагодарить автора Отправить деньги

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

Алексей Шумаев
02 декабря 2019, 08:42
0
Для тех, кто только начинает работать с MS2 (особенно, если не читать документацию) — будет весьма кстати.
    Михаил
    02 декабря 2019, 10:05
    0
    Тож смотрю, вроде прямо это в доках есть. Но за статью + однозначно
    Павел Гвоздь
    03 декабря 2019, 08:35
    +2
    miniShop2.Callbacks.Order.getcost.response.success
    miniShop2.Callbacks.Order.getcost.response.error
    miniShop2.Callbacks.Order.add.response.success
    Чёрт возьми! А я то думаю, кто вот такую дрянь уже на котором клиентском сайте делает! Блин, ну есть же дока, что вы творите?!

    Никогда так не делайте!

    Это т.н. старый способ, минус его в том, что он затирает вообще все правки на данные колбэки, которые были сделаны до него по нормальному, методами miniShop2.Callbacks[add/remove]. И кажется затирает все правки и после него…



    P.S.: Плюсанул раньше, чем дошёл до этого момента. Теперь минус ставить не хочется. Прошу исправить этот косяк в коде!
      Олег Щавелев
      03 декабря 2019, 10:18
      0
      Видел именно данный вызов. Его много кто цитировал. Действительно все сообщения упоменающие данное решение старые. Сейчас осмыслю документацию и переделаю. Возможно это займет время, но обновление посты с исправления замечаний будет.
        Олег Щавелев
        03 декабря 2019, 11:24
        +4
        Внес изменение в JS согласно документации. Спасибо!
        Bor
        Bor
        06 декабря 2019, 21:17
        0
        Автор, спасибо!
        есть много простых вещей, которые нигде не описаны, и приходится на них тратить кучу времени, хотя нужны постоянно.
        Павел Гвоздь
        10 марта 2020, 14:19
        1
        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 доставки
        }
        А что если в методе msDeliveryHandler::getCost стоимость доставки зависит от стоимости заказа во втором переданном параметре $cost? А вы туда «0» передаёте. Следовательно ваша стоимость доставки будет одна, а по сути — другая. Надо делать как-то так:

        /** @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);
        }
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8