Изменение стоимости доставки в default.js
Привет ребята!
Столкнулся с небольшой проблемой, думаю многие уже с ней сталкивались, но в поиске ничего стоящего не нашел.
Задача стояла в том, чтобы сделать бесплатную доставку при заказе от 10 т.р. в пределах МКАД и от 15 т.р. за пределы мкад.
Назначил свои кастомные классы для каждого способа доставки, все считает прекрасно в [[+order_cost]]. Но вот не пойму как сделать чтобы вместо [[+price]] (цены доставки) подставлялось налету 0 руб. чтобы сказать клиенту что доставка теперь бесплатна?
Нашел этот коммент Василия, но так и не понял где что поправить.
Столкнулся с небольшой проблемой, думаю многие уже с ней сталкивались, но в поиске ничего стоящего не нашел.
Задача стояла в том, чтобы сделать бесплатную доставку при заказе от 10 т.р. в пределах МКАД и от 15 т.р. за пределы мкад.
Назначил свои кастомные классы для каждого способа доставки, все считает прекрасно в [[+order_cost]]. Но вот не пойму как сделать чтобы вместо [[+price]] (цены доставки) подставлялось налету 0 руб. чтобы сказать клиенту что доставка теперь бесплатна?
Нашел этот коммент Василия, но так и не понял где что поправить.
Комментарии: 20
метод getcost
miniShop2.Callbacks.Order.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');
}
Спасибо Володе за помощь, выкладываю решение данного вопроса, думаю многим пригодится.
1. Нужно создать класс-наследника msDeliveryInterface
2. Положить в /core/components/minishop2/custom/delivery/имякласса.class.php
3. Указать имя класса (не файла) в методе доставки, в админке.
Вот нашел рабочий код для кастомного класса:
4. Дальше создаем свой класс заказа и прописываем имя в настройках минишопа, кладем его сюда
core/components/minishop2/custom/order/Имя класса.class.php
Содиржимое:
5. Далее в чанке со строками вывода цены доставки (в нашем случае tpl.msOrder.delivery), оборачиваем плейсхолдер в
1. Нужно создать класс-наследника msDeliveryInterface
2. Положить в /core/components/minishop2/custom/delivery/имякласса.class.php
3. Указать имя класса (не файла) в методе доставки, в админке.
Вот нашел рабочий код для кастомного класса:
<?php
class msDeliveryHandler_free10 extends msDeliveryHandler{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$cart = $this->ms2->cart->status();
if ($cart['total_cost']<10000) {
$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;
}
}
В коде выше мы написали что у нас стоимость доставки при сумме заказа больше 10 т.р. = 0.4. Дальше создаем свой класс заказа и прописываем имя в настройках минишопа, кладем его сюда
core/components/minishop2/custom/order/Имя класса.class.php
Содиржимое:
<?php
if(!class_exists('msOrderInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php';
}
class Имя класса extends msOrderHandler implements msOrderInterface {
public function getCost($with_cart = true, $only_cost = false) {
$cart = $this->ms2->cart->status();
$cost = $with_cart
? $cart['total_cost']
: 0;
$deliveryCost = 0;
/* @var msDelivery $delivery */
if ($delivery = $this->modx->getObject('msDelivery', $this->order['delivery'])) {
$cost = $delivery->getCost($this, $cost);
$deliveryCost = $delivery->getCost($this, 0);
}
/* @var msPayment $payment */
if ($payment = $this->modx->getObject('msPayment', $this->order['payment'])) {
$cost = $payment->getCost($this, $cost);
}
return $only_cost
? $cost
: $this->success('', array(
'cost' => $cost
,'delivery_cost'=>$deliveryCost
,'delivery_id'=> $this->order['delivery']['id']
)
);
}
}
В коде вместо Имя класса, указываем свой.5. Далее в чанке со строками вывода цены доставки (в нашем случае tpl.msOrder.delivery), оборачиваем плейсхолдер в
<span id="delivery_cost_[[+id]]">[[+price]]</span>
Вот и все, должно работать.
Что у вас за класс msDeliveryHandler_free10 в первом коде?
Как только все подключаю страница с доставкой и способами оплаты просто перестает грузиться… Видимо в приведенных примерах ошибка где-то в php
Как только все подключаю страница с доставкой и способами оплаты просто перестает грузиться… Видимо в приведенных примерах ошибка где-то в php
Чтобы понимать, что откуда берется, прочтите пожалуйста заметку Василия, ссылка на которую есть выше. Там описывается как работать с корзиной. Прочитав, должно все встать на свои места. Это работало на минишопе до глобального обновления, как сейчас — не знаю.
Создал в раздела следующие файлы:
/public_html/core/components/minishop2/custom/order/msDeliveryHandler_free10.class.php
/public_html/core/components/minishop2/custom/delivery/msDeliveryHandler_free10.class.php
Прописал следующий код:
В самой доставке которая будет обрабатываться задал класс: prnt.sc/ah8b2y msDeliveryHandler_free10
В настройках Minishop заменил переопределеный обработчик: prnt.sc/ah8bsl mynewOrderHandler
В чанке tpl.msOrder.delivery прописал обертку цены
Но сумма как была 0 в доставке так и осталась, но общая сумма меняется, что сделал не таки как сделать чтобы возле доставки стоимость отображалась ????
Спасибо prnt.sc/ah8dix
/public_html/core/components/minishop2/custom/order/msDeliveryHandler_free10.class.php
/public_html/core/components/minishop2/custom/delivery/msDeliveryHandler_free10.class.php
Прописал следующий код:
<?php
if(!class_exists('msOrderInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msorderhandler.class.php';
}
class mynewOrderHandler extends msOrderHandler implements msOrderInterface {
public function getCost($with_cart = true, $only_cost = false) {
$cart = $this->ms2->cart->status();
$cost = $with_cart
? $cart['total_cost']
: 0;
$deliveryCost = 0;
/* @var msDelivery $delivery */
if ($delivery = $this->modx->getObject('msDelivery', $this->order['delivery'])) {
$cost = $delivery->getCost($this, $cost);
$deliveryCost = $delivery->getCost($this, 0);
}
/* @var msPayment $payment */
if ($payment = $this->modx->getObject('msPayment', $this->order['payment'])) {
$cost = $payment->getCost($this, $cost);
}
return $only_cost
? $cost
: $this->success('', array(
'cost' => $cost
,'delivery_cost'=>$deliveryCost
,'delivery_id'=> $this->order['delivery']['id']
)
);
}
}
и<?php
class msDeliveryHandler_free10 extends msDeliveryHandler
{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0)
{
$cart = $this->ms2->cart->status();
if (($cart['total_cost'] >= 0) AND ($cart['total_cost'] <= 1100))
{
$cost = $cart['total_cost'] + 250;
}
if (($cart['total_cost'] >= 1101) AND ($cart['total_cost'] <= 3500))
{
$cost = $cart['total_cost'] + 100;
}
return $cost;
}
}
В самой доставке которая будет обрабатываться задал класс: prnt.sc/ah8b2y msDeliveryHandler_free10
В настройках Minishop заменил переопределеный обработчик: prnt.sc/ah8bsl mynewOrderHandler
В чанке tpl.msOrder.delivery прописал обертку цены
<span id="delivery_cost_[[+id]]">[[+price]] [[%ms2_frontend_currency]]</span>
____________________________Но сумма как была 0 в доставке так и осталась, но общая сумма меняется, что сделал не таки как сделать чтобы возле доставки стоимость отображалась ????
Спасибо prnt.sc/ah8dix
Добрый день, я реализовал чтоб цена доставки зависела от улицы, подскажите где копать чтоб обновлялась цена, чтоб не надо было обновлять страницу
В соседней теме обсуждается необходимая вещь.
modx.pro/development/8817-do-colbecki-minishop2-for-all/
Но не ищите там решение, его нужно понять самостоятельно.
modx.pro/development/8817-do-colbecki-minishop2-for-all/
Но не ищите там решение, его нужно понять самостоятельно.
а можете направить в нужное русло, не могу понять
более подробно, есть страница с корзиной sushi-avangard.ru/korzina/
поле улица заполняется autocomplete, например улица «Аносова улица» добавляет 100 руб к цене, а «23 км казарма» 300 рублей, наценка происходит после обновления страницы
поле улица заполняется autocomplete, например улица «Аносова улица» добавляет 100 руб к цене, а «23 км казарма» 300 рублей, наценка происходит после обновления страницы
Необходимо «повесить» callback на успешный результат добавления поля в заказ.
все сделал, спасибо
Всем привет! Помогите разобраться с аналогичным вопросом относительно изменения стоимости доставки при заказе от 300$. В настройках minishop2 во всех вариантах доставки указан кастомный класс обработчик TtsSimpleDelyvery (ttssimpledelivery.class.php). При его редактировании, будь он вообще пустым, ничего не меняется на странице chekout. Привязка стоимости доставки к странам мира выполнена через таблицы баз данных. В чем может быть причина? При добавлении нового способа доставки и указании вышеупомянутого класса, этот вариант появляется в перечне вариантов в выпадающем списке, но если для него указать дополнительную стоимость (например), то ничего не происходит…
Что необходимо сделать, чтобы добавить бесплатную доставку, при заказе от 300$?
Сейчас файл класса имеет следующий вид:
<?php
require_once MODX_CORE_PATH. 'components/minishop2/model/minishop2/msdeliveryhandler.class.php';
class TtsSimpleDelivery extends msDeliveryHandler
{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0)
{
$this->modx->addPackage('tts', $this->modx->getOption('tts.core_path', null, $this->modx->getOption('core_path'). 'components/tts/'). 'model/');
$order = $this->ms2->order->get();
$country = $this->modx->getObject('TtsCountry', array(
'id' => (int)$this->modx->getOption('country', $order),
));
if (!$country) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
$regionId = (int)$this->modx->getOption('region', $order);
$region = null;
$count = $this->modx->getCount('TtsCountryRegion', array(
'country_id' => $country->get('id'),
));
if ($count) {
$region = $this->modx->getObject('TtsCountryRegion', array(
'id' => $regionId,
'country_id' => $country->get('id'),
));
if (!$region) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
}
mb_internal_encoding('UTF-8');
$city = mb_strtolower(trim($this->modx->getOption('city', $order)));
$moscow = array(
'москва',
'moscow',
);
$kiev = array(
'киев',
'kiev',
);
/*if (!$payment || ($payment->id == 1 && $country->id == 177 && !in_array($city, $moscow))) {
return Redirect::route('cart.step2');
}*/
if ($delivery->get('name') == 'tts.delivery.free') {
if (!in_array($country->get('id'), array(177, 223)) || ($country->get('id') == 177 && !in_array($city, $moscow)) || ($country->get('id') == 223 && !in_array($city, $kiev))) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
}
return $cost;
}
$zone = $this->modx->getObject('TtsDeliveryZone', array(
'id' => (int)$this->modx->getOption('delivery_zone', $order),
'delivery_id' => $delivery->get('id'),
));
if (!$zone) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
$fee = floatval($zone->fee);
if ($delivery->get('name') == 'tts.delivery.dhl') {
$cart = $this->ms2->cart->status();
$fee *= $cart['total_count'];
}
return $cost + $fee;
}
}
Что необходимо сделать, чтобы добавить бесплатную доставку, при заказе от 300$?
Сейчас файл класса имеет следующий вид:
<?php
require_once MODX_CORE_PATH. 'components/minishop2/model/minishop2/msdeliveryhandler.class.php';
class TtsSimpleDelivery extends msDeliveryHandler
{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0)
{
$this->modx->addPackage('tts', $this->modx->getOption('tts.core_path', null, $this->modx->getOption('core_path'). 'components/tts/'). 'model/');
$order = $this->ms2->order->get();
$country = $this->modx->getObject('TtsCountry', array(
'id' => (int)$this->modx->getOption('country', $order),
));
if (!$country) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
$regionId = (int)$this->modx->getOption('region', $order);
$region = null;
$count = $this->modx->getCount('TtsCountryRegion', array(
'country_id' => $country->get('id'),
));
if ($count) {
$region = $this->modx->getObject('TtsCountryRegion', array(
'id' => $regionId,
'country_id' => $country->get('id'),
));
if (!$region) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
}
mb_internal_encoding('UTF-8');
$city = mb_strtolower(trim($this->modx->getOption('city', $order)));
$moscow = array(
'москва',
'moscow',
);
$kiev = array(
'киев',
'kiev',
);
/*if (!$payment || ($payment->id == 1 && $country->id == 177 && !in_array($city, $moscow))) {
return Redirect::route('cart.step2');
}*/
if ($delivery->get('name') == 'tts.delivery.free') {
if (!in_array($country->get('id'), array(177, 223)) || ($country->get('id') == 177 && !in_array($city, $moscow)) || ($country->get('id') == 223 && !in_array($city, $kiev))) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
}
return $cost;
}
$zone = $this->modx->getObject('TtsDeliveryZone', array(
'id' => (int)$this->modx->getOption('delivery_zone', $order),
'delivery_id' => $delivery->get('id'),
));
if (!$zone) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
$fee = floatval($zone->fee);
if ($delivery->get('name') == 'tts.delivery.dhl') {
$cart = $this->ms2->cart->status();
$fee *= $cart['total_count'];
}
return $cost + $fee;
}
}
Для начала, используй тэг для кода. В таком виде читать невозможно, а разбираться и тратить лишнее время ни у кого желания нет вообще никакого.
<?php
require_once MODX_CORE_PATH . 'components/minishop2/model/minishop2/msdeliveryhandler.class.php';
class TtsSimpleDelivery extends msDeliveryHandler
{
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0)
{
$this->modx->addPackage('tts', $this->modx->getOption('tts.core_path', null, $this->modx->getOption('core_path') . 'components/tts/') . 'model/');
$order = $this->ms2->order->get();
$country = $this->modx->getObject('TtsCountry', array(
'id' => (int)$this->modx->getOption('country', $order),
));
if (!$country) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
$regionId = (int)$this->modx->getOption('region', $order);
$region = null;
$count = $this->modx->getCount('TtsCountryRegion', array(
'country_id' => $country->get('id'),
));
if ($count) {
$region = $this->modx->getObject('TtsCountryRegion', array(
'id' => $regionId,
'country_id' => $country->get('id'),
));
if (!$region) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
}
mb_internal_encoding('UTF-8');
$city = mb_strtolower(trim($this->modx->getOption('city', $order)));
$moscow = array(
'москва',
'moscow',
);
$kiev = array(
'киев',
'kiev',
);
/*if (!$payment || ($payment->id == 1 && $country->id == 177 && !in_array($city, $moscow))) {
return Redirect::route('cart.step2');
}*/
if ($delivery->get('name') == 'tts.delivery.free') {
if (!in_array($country->get('id'), array(177, 223)) || ($country->get('id') == 177 && !in_array($city, $moscow)) || ($country->get('id') == 223 && !in_array($city, $kiev))) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
}
return $cost;
}
$zone = $this->modx->getObject('TtsDeliveryZone', array(
'id' => (int)$this->modx->getOption('delivery_zone', $order),
'delivery_id' => $delivery->get('id'),
));
if (!$zone) {
if ($this->modx->getPlaceholder('throw_ms2_exceptions')) {
throw new Exception();
}
return $cost;
}
$fee = floatval($zone->fee);
if ($delivery->get('name') == 'tts.delivery.dhl') {
$cart = $this->ms2->cart->status();
$fee *= $cart['total_count'];
}
return $cost + $fee;
}
}
Если недостаточно информации, то скажите, что еще нужно, я выложу. Спасибо.
Этот код учитывает обнуляет стоимость доставки при достижении определенной суммы в корзине. Если доставка платная, то учитывается указанная стоимость доставки в свойствах метода доставки.
<?php
if(!class_exists('msDeliveryInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
}
class msDeliveryFreeBySumHandler extends msDeliveryHandler implements msDeliveryInterface {
/** @inheritdoc} */
public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0) {
$freeOrderSum = $this->modx->getOption('ms2_delivery_free_min_order_sum', null, 0);
$cart = $order->ms2->cart->status();
$cart_cost = $cart['total_cost'];
$delivery_cost = $cart_cost > $freeOrderSum ? 0 : parent::getCost($order, $delivery, $cost);
$total_cost = $cost > 0 ? $delivery_cost : $cost;
return $total_cost;
}
}
Очень нужно решить этот вопрос, а то уже намучился с ним… Буду всем благодарен!
сделал все по инструкции, но при выборе класса-обработчика выводит Ошибка
Код: 500 Internal Server Error, помогите как решить
Код: 500 Internal Server Error, помогите как решить
Столкнулся с тем же, проблема решается если изменить путь подключения класса msDeliveryInterface в примере кода выше, а конкретно:
if(!class_exists('msDeliveryInterface')) {
require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
}
Подскажите, кто нибудь решил проблему с 500 ошибкой?
Всё сделал по инструкции, пробовал разные варианты, но всё равно выдаёт 500 ошибку, а класс-обработчик прописать не даёт…
Всё сделал по инструкции, пробовал разные варианты, но всё равно выдаёт 500 ошибку, а класс-обработчик прописать не даёт…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.