Бесплатная доставка курьером от определенной суммы
Здравствуйте. Пожалуйста, подскажите как реализовать данный функционал:
например, до 5000 тысяч доставка 300 рублей, от 5000 тысяч – бесплатно?
joxi.ru/zAN5Mxls156329
например, до 5000 тысяч доставка 300 рублей, от 5000 тысяч – бесплатно?
joxi.ru/zAN5Mxls156329
Комментарии: 27
Необходимо создать кастомный класс доставки:
1) Идем в core/components/minishop2/custom/delivery/ и создаем здесь свой пхп файл (допустим, mscustomdeliveryhandler.class.php) со следующим содержимым:
2) Идем в настройки магазина -> Варианты доставки.
Создаем новый вариант «Доставка» (или редактируем исходный), после чего заполняем в «дополнительную стоимость» требуемое значение (300 рублей), в Класс-обработчик пишем название созданного файла — mscustomdeliveryhandler, заполняем доступные способы оплаты и ставим галочку напротив «включен».
1) Идем в core/components/minishop2/custom/delivery/ и создаем здесь свой пхп файл (допустим, mscustomdeliveryhandler.class.php) со следующим содержимым:
<?php
//Важно: при изменении названия файла, вот в этом месте также нужно изменить класс
class mscustomdeliveryhandler extends msDeliveryHandler{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$cart = $this->ms2->cart->status();
//условие начисление доставки
if ($cart['total_cost'] < 5000) {
$add_price = $delivery->get('price');
if (preg_match('/%$/', $add_price)) {
$add_price = str_replace('%', '', $add_price);
$add_price = $cost / 100 * $add_price;
}
$cost += $add_price;
}
return $cost;
}
}
2) Идем в настройки магазина -> Варианты доставки.
Создаем новый вариант «Доставка» (или редактируем исходный), после чего заполняем в «дополнительную стоимость» требуемое значение (300 рублей), в Класс-обработчик пишем название созданного файла — mscustomdeliveryhandler, заполняем доступные способы оплаты и ставим галочку напротив «включен».
Работает, спасибо Вам большое!
У меня это работает, но цены отображаемые у доставки остаются прежними. Оформление заказа я добавил в корзину.
Я добавил снипет при выводе цены доставки (снипет сверяет данные и если больше то выдает 0), и стало вроде работать, но если мы через AJAX удаляем товары из корзины, то цена доставки не меняется AJAX'ом, не подскажете как это реализовать?
Я добавил снипет при выводе цены доставки (снипет сверяет данные и если больше то выдает 0), и стало вроде работать, но если мы через AJAX удаляем товары из корзины, то цена доставки не меняется AJAX'ом, не подскажете как это реализовать?
Попробуйте этот вариант — github
Только вчера сделал pull request в доку, Василий еще не проверил его.
Может быть подойдет пример без доработок.
Только вчера сделал pull request в доку, Василий еще не проверил его.
Может быть подойдет пример без доработок.
Ну вот, собственно уже в доке — Пример подключения собственного класса доставки
ЗДравствуйте, Все делаю как написанно, но при выборе класса обработчика выдает 500 ошибку:( с чем связано? уже 3 часа над этим бьюсь. Помогите пожалуста
В логах PHP что пишет?
Может и ошибаюсь, но как по мне пример неправильный.
Судите сами:
1. клас обработчика Вы предлагаете создать в каталоге "/core/components/minishop2custom";
2. А вот регистрируете уже совсем по другому адресу "{core_path}components/minishop2/custom/msDeliveryHandlerMsk.class.php";
Или я не прав?
Судите сами:
1. клас обработчика Вы предлагаете создать в каталоге "/core/components/minishop2custom";
2. А вот регистрируете уже совсем по другому адресу "{core_path}components/minishop2/custom/msDeliveryHandlerMsk.class.php";
Или я не прав?
Это опечатка, не более. Правильный путь — minishop2/custom
Даже исправление уже есть github.com/bezumkin/Docs/commit/f4ced34c259317da649bafef39f550c0b4d6872c
Даже исправление уже есть github.com/bezumkin/Docs/commit/f4ced34c259317da649bafef39f550c0b4d6872c
С исправлениями тоже не работает, все пути проверил 10 раз — все равно ошибка 500.
Добрый день. Вы смогли решить проблему с 500 ошибкой?
У меня получилось решить данную проблему.
Во первых нужно удалить ранее зарегистрированные сервисы:
Во первых нужно удалить ранее зарегистрированные сервисы:
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->removeService('delivery', 'MskDelivery');
}
Создаем файл в core/components/minishop2/custom/delivery/msdeliverycourierhandler.class.php<?php
if (!class_exists('msDeliveryHandler')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
}
class msDeliveryCourierHandler extends msDeliveryHandler implements msDeliveryInterface {
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0.0) {
$freedeliverysumm = 90;
$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;
}
}
}
Регистрируем:if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addService('delivery', 'msDeliveryCourierHandler',
'{core_path}components/minishop2/custom/delivery/msdeliverycourierhandler.class.php'
);
}
помогло, спасибо огромное.
Удалять надо не только в Console, но и про файл в core/components/minishop2/custom/delivery не забываем :))
Удалять надо не только в Console, но и про файл в core/components/minishop2/custom/delivery не забываем :))
Еще может быть проблема в указанном в самом файле пути.
Попробуйте заменить на:
Попробуйте заменить на:
/../model/minishop2/msdeliveryhandler.class.php
У меня 500-я ошибка была именно из-за того, что он не мог достучаться до msdeliveryhandler.class.php
Можете немного пояснить код:
Если сумма до 1,000 доставка = 350 рублей
Если сумма больше 1,000 доставка = 250 рублей
Если сумма больше 5,000 доставка = 0 рублей
Спасибо!
if ($cart['total_cost'] < 5000) {
$add_price = $delivery->get('price');
if (preg_match('/%$/', $add_price)) {
$add_price = str_replace('%', '', $add_price);
$add_price = $cost / 100 * $add_price; // Я это понять не могу
}
$cost += $add_price;
}
У меня немного сложнее задача:Если сумма до 1,000 доставка = 350 рублей
Если сумма больше 1,000 доставка = 250 рублей
Если сумма больше 5,000 доставка = 0 рублей
Спасибо!
Если наценка указана в процентах (присутствует соответствующий символ) — то считаем наценку и прибавляем, иначе просто прибавляем.
В вашем случае достаточно свитчить $cart['total_cost'] и, в зависисимости от требуемых условий, приплюсовывать к $cost нужную сумму.
В вашем случае достаточно свитчить $cart['total_cost'] и, в зависисимости от требуемых условий, приплюсовывать к $cost нужную сумму.
if ($cart['total_cost'] < 1000) {
$add_price = $delivery->get('price');
if (preg_match('/%$/', $add_price)) {
$add_price = str_replace('%', '', $add_price);
$add_price = $cost + 350 * $add_price;
}
$cost += $add_price;
}
if ($cart['total_cost'] > 1000) {
$add_price = $delivery->get('price');
if (preg_match('/%$/', $add_price)) {
$add_price = str_replace('%', '', $add_price);
$add_price = $cost + 250 * $add_price;
}
$cost += $add_price;
}
if ($cart['total_cost'] > 5000) {
$add_price = $delivery->get('price');
if (preg_match('/%$/', $add_price)) {
$add_price = str_replace('%', '', $add_price);
$add_price = $cost + 0 * $add_price;
}
$cost += $add_price;
}
Имеете в виду, так что ли?
Нет, имею ввиду вот так:
switch (true) {
case $cart['total_cost'] <= 1000:
$cost += 350;
break;
case $cart['total_cost'] <= 5000:
$cost += 250;
break;
case $cart['total_cost'] > 5000:
$cost += 0;
break;
}
return $cost;
Спасибо, то что нужно!
Вопрос, получается что в настройках в админке (http://joxi.ru/8AndjoeUqloOVm) он вообще игнорирует, если мы собственным классом все указали?
Вопрос, получается что в настройках в админке (http://joxi.ru/8AndjoeUqloOVm) он вообще игнорирует, если мы собственным классом все указали?
В текущем варианте — да (свой класс обработки события msDeliveryHandler).
А вообще, зависит от того, на каком этапе формирования цены вклиниться.
А вообще, зависит от того, на каком этапе формирования цены вклиниться.
А не могли бы Вы подсказать, если нужно только к определенной оплате подключить бесплатную доставку, как это сделать? К примеру к payment_1 и к payment_5
1) Создать класс в core/components/minishop2/custom/delivery (инструкция)
2) Зарегистрировать созданный класс (инструкция)
3) Указать в нужных методах доставки созданный класс
2) Зарегистрировать созданный класс (инструкция)
3) Указать в нужных методах доставки созданный класс
В плагине выше допишите условие по такому принципу:
if ($delivery->get('id') == 'нужный_айди') {
//обнуление стоимости
}
Вывожу отдельно для доставки цену
{$deliveries[4].price}
как обратится к ней из msdeliveryhandlermsk.class.php?
что может быть не так?
Название класса в файле custom/delivery/my…. Обратите внимание на строку
class mydeliveryhandler extends msDeliveryHandler{
Подскажите, а как привязать бесплатную доставку не к сумме а к количеству товара в корзине.
переписал класс так, но не работает:
переписал класс так, но не работает:
<?php
if(!class_exists('msDeliveryInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
}
class msDeliveryHandlerCount extends msDeliveryHandler implements msDeliveryInterface{
public function getCount(msOrderInterface $order, msDelivery $delivery, $count = 0) {
$freedeliverycount = 50;
$cart = $order->ms2->cart->status();
$cart_count = $cart['total_count'];
if($cart_count > $freedeliverycount){
return $count;
}else{
$delivery_count = parent::getCost($order, $delivery, $count);
return $delivery_count;
}
}
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.