Изменить стоимость заказа minishop2 в сниппете
Доброго времени суток!)
Хочу сделать скидку по определенным параметрам, допустим, просто вычесть 100 рублей из заказа как подарок.
Раскопав исходники msDiscount и miniShop2, в поисках того, как адекватно сделать скидку, нашел, что можно сделать с помощью дополнительного параметра в массиве заказа и событий msOnGetOrderCost и msOnBeforeAddToOrder.
Но, хотелось бы избежать всех этих манипуляций и заранее в сниппете сделать это. Пробую так:
Вопрос. Можно ли это как-то сделать в сниппете и всё же сделать через инпут и не парится со всем этим перфекционизмом?
Хочу сделать скидку по определенным параметрам, допустим, просто вычесть 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.Вопрос. Можно ли это как-то сделать в сниппете и всё же сделать через инпут и не парится со всем этим перфекционизмом?
Поблагодарить автора
Отправить деньги
Комментарии: 2
Мне кажется, что такую задачу нужно делать через плагин, а не сниппет
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.