Изменить стоимость заказа minishop2 в сниппете

Доброго времени суток!)

Хочу сделать скидку по определенным параметрам, допустим, просто вычесть 100 рублей из заказа как подарок.

Раскопав исходники msDiscount и miniShop2, в поисках того, как адекватно сделать скидку, нашел, что можно сделать с помощью дополнительного параметра в массиве заказа и событий msOnGetOrderCost и msOnBeforeAddToOrder.

case 'msOnGetOrderCost':
        /** @var float $cost */
        if (!empty($with_cart) && !empty($cost)) {
            /** @var msOrderInterface $order */
            if (($data = $order->get())) {
                if ($data['discount']) {
                    $order_cost = $cost;
                    $discount = 100;
                    $cost -= $discount;
                }
            }

            if ($cost >= 1) {
                $modx->event->returnedValues['cost'] = $cost;
            }
        }
        break;
Если делать это с помощью JS, то есть делать скрытый инпут со значением скидки, при загрузке страницы вешать change на это поле, ловить callback и запускать метод miniShop2.Order.getcost(); то всё оки, всё работает.
Но, хотелось бы избежать всех этих манипуляций и заранее в сниппете сделать это. Пробую так:

<?php

if (!$ms2 = $modx->getService('minishop2')) {
    $modx->log(modX::LOG_LEVEL_ERROR, '[discount] Requires installed miniShop2.');
    return false;
}

$ms2->initialize($ctx);
$order_class = 'msOrderHandler';

$ms2->order = new $order_class($ms2, $ms2->config);

if (!($ms2->order instanceof msOrderInterface) || $ms2->order->initialize($ctx) !== true) {
    $modx->log(modX::LOG_LEVEL_ERROR, 'Could not initialize miniShop2 order handler class: "' . $order_class . '"');

    return false;
}

$cart_class = 'msCartHandler';
$ms2->cart = new $cart_class($ms2, $ms2->config);
if (!($ms2->cart instanceof msCartInterface) || $ms2->cart->initialize($ctx) !== true) {
    $ms2->modx->log(modX::LOG_LEVEL_ERROR, 'Could not initialize miniShop2 cart handler class: "' . $cart_class . '"');

    return false;
}


$with_cart = true;
$only_cost = false;

$cart = $ms2->cart->status();
$cost = $with_cart ? $cart['total_cost'] : 0;

$order = $ms2->order->get();

$order['discount'] = true;

$response = $ms2->invokeEvent('msOnGetOrderCost', array(
    'order' => $order,
    'cart' => $ms2->cart,
    'with_cart' => $with_cart,
    'only_cost' => $only_cost,
    'cost' => $cost,
    ));

return;
Но не срабатывает. Если попытаться распечатать $response (по идее это просто массив, если смотреть исходники msorderhandler.class.php), то страница падает с ошибкой 500.

Вопрос. Можно ли это как-то сделать в сниппете и всё же сделать через инпут и не парится со всем этим перфекционизмом?
Дмитрий
09 сентября 2018, 00:52
modx.pro
2 619
0
Поблагодарить автора Отправить деньги

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

Баха Волков
09 сентября 2018, 22:15
0
Мне кажется, что такую задачу нужно делать через плагин, а не сниппет
    Руслан Сафин
    10 сентября 2018, 00:30
    0
    Не понятно на каком этапе вы хотите сделать скидку.

    Вот документация по событиям, мб пригодится
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2