Способ, который сейчас считается устравшим, заключается в том чтобы:
- Разместить в
core/components/minishop2/custom/delivery/
файл с классом, расширяющимmsDeliveryHandler
- Указать название этого класса в настройках способа доставки, в поле
Класс-обработчик
Не имею ничего против этого способа, так что опишу подробнее как он выполняется
Создаем файл с расширением класса
Создаем файл core/components/minishop2/custom/delivery/
myDeliveryHandler.class.php
Название файла должно соответствовать имени класса, например:
- Файл myMsDeliveryHandler.class.php
- Класс myMsDeliveryHandler
class myMsDeliveryHandler extends msDeliveryHandler{ public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) { $cart = $this->ms2->cart->status(); $delivery_price = $delivery->get('price'); if ($cart['total_cost'] <= 2500) { // Если сумма заказа меньше или равна 2500, ставим полную цену доставки $cost += $add_price; }elseif($cart['total_cost'] <= 5000) { // Если сумма заказа меньше или равна 5000, но больше 2500, то цену доставки делаем вполовину меньше $cost += $add_price / 2; }else{ // Если сумма больше 5000, то не добавляем ничего :) } return $cost; } }
Прописать назване класса в настройках
Переходим в настройки доставки MiniShop2, и в нужном способе — прописываем название нового класса myMsDeliveryHandler
в поле Класс-обработчик.
Новый рекомендуемый способ - через подключение службы
Метод описан на сайте docs.modx.pro. Но я сталкивался с тем, что ссылки на этот сайт становятся битыми, поэтому продублирую тут приведенную там инструкцию
Подключение сервиса
Правильный способ - создать php файл и зарегистрировать его через метод miniShop2::addService()
:
if ($miniShop2 = $modx->getService('miniShop2')) { $miniShop2->addService('payment', 'CustomerAccount', '{core_path}components/msprofile/model/msprofile/customeraccount.class.php' ); }
Данный код нужно выполнить 1 раз в сниппете на странице или в компоненте Console. Каждый раз регистрировать php файл не нужно.
Метод принимает следующие параметры:
- Тип сервиса: cart, order, delivery или payment.
- Уникальное название
- Путь к PHP файлу с классом. Можно использовать плейсхолдеры
{base_path}
,{core_path}
и{assets_path}
.
Удаление сервиса
Удаление сервиса производится через метод miniShop2::removeService()
:
if ($miniShop2 = $modx->getService('miniShop2')) { $miniShop2->removeService('payment', 'CustomerAccount'); }
Здесь нужно указать только тип и уникальное имя зарегистрированного сервиса.
Пример подключения собственного класса доставки
Допустим нам необходимо обнулить стоимость доставки при общей сумме заказа свыше 5000, для этого, создадим php файл msdeliveryhandlermsk.class.php
в произвольном каталоге, например: /core/components/minishop2/custom/delivery
*, со следующим содержимым:
if(!class_exists('msDeliveryInterface')) { require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php'; } class msDeliveryHandlerMsk extends msDeliveryHandler implements msDeliveryInterface{ public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) { $freedeliverysumm = 5000; $cart = $order->ms2->cart->status(); $cart_cost = $cart['total_cost']; if($cart_cost > $freedeliverysumm){ return $cost; }else{ $delivery_cost = parent::getCost($order, $delivery, $cost); return $delivery_cost; } } }
Далее, зарегистрируем службу по этому адресу выполнив код ниже в сниппете или в Console:
if ($miniShop2 = $modx->getService('miniShop2')) { $miniShop2->addService('delivery', 'MskDelivery', '{core_path}components/minishop2/custom/delivery/msdeliveryhandlermsk.class.php' ); }
Теперь нам остается выбрать класс обработчик в настройках minishop2
Комментарии (0)
Не писать ответ