Изменение стоимости доставки в 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 ошибку, а класс-обработчик прописать не даёт…
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.