Изменение стоимости доставки в default.js

Привет ребята!
Столкнулся с небольшой проблемой, думаю многие уже с ней сталкивались, но в поиске ничего стоящего не нашел.
Задача стояла в том, чтобы сделать бесплатную доставку при заказе от 10 т.р. в пределах МКАД и от 15 т.р. за пределы мкад.
Назначил свои кастомные классы для каждого способа доставки, все считает прекрасно в [[+order_cost]]. Но вот не пойму как сделать чтобы вместо [[+price]] (цены доставки) подставлялось налету 0 руб. чтобы сказать клиенту что доставка теперь бесплатна?
Нашел этот коммент Василия, но так и не понял где что поправить.
Артём Добряков
21 сентября 2014, 23:15
modx.pro
5
3 884
0

Комментарии: 20

Володя
22 сентября 2014, 11:23
0
метод 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');
}
    Артём Добряков
    02 октября 2014, 01:15
    2
    +1
    Спасибо Володе за помощь, выкладываю решение данного вопроса, думаю многим пригодится.
    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>
    Вот и все, должно работать.
      Даниил
      27 июля 2015, 13:48
      0
      Что у вас за класс msDeliveryHandler_free10 в первом коде?
      Как только все подключаю страница с доставкой и способами оплаты просто перестает грузиться… Видимо в приведенных примерах ошибка где-то в php
        Артём Добряков
        27 июля 2015, 16:19
        0
        Чтобы понимать, что откуда берется, прочтите пожалуйста заметку Василия, ссылка на которую есть выше. Там описывается как работать с корзиной. Прочитав, должно все встать на свои места. Это работало на минишопе до глобального обновления, как сейчас — не знаю.
        Слава
        19 марта 2016, 17:16
        0
        Создал в раздела следующие файлы:
        /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
        Павел
        22 мая 2016, 19:52
        0
        Добрый день, я реализовал чтоб цена доставки зависела от улицы, подскажите где копать чтоб обновлялась цена, чтоб не надо было обновлять страницу
          Воеводский Михаил
          23 мая 2016, 00:42
          0
          В соседней теме обсуждается необходимая вещь.
          modx.pro/development/8817-do-colbecki-minishop2-for-all/
          Но не ищите там решение, его нужно понять самостоятельно.
            Павел
            23 мая 2016, 19:51
            0
            а можете направить в нужное русло, не могу понять
              Павел
              23 мая 2016, 20:07
              0
              более подробно, есть страница с корзиной sushi-avangard.ru/korzina/
              поле улица заполняется autocomplete, например улица «Аносова улица» добавляет 100 руб к цене, а «23 км казарма» 300 рублей, наценка происходит после обновления страницы
                Воеводский Михаил
                23 мая 2016, 21:33
                0
                Необходимо «повесить» callback на успешный результат добавления поля в заказ.
            Павел
            24 мая 2016, 20:54
            0
            все сделал, спасибо
              Vitaliy
              27 мая 2016, 17:25
              0
              Всем привет! Помогите разобраться с аналогичным вопросом относительно изменения стоимости доставки при заказе от 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;
              }
              }
                Воеводский Михаил
                28 мая 2016, 13:49
                +1
                Для начала, используй тэг для кода. В таком виде читать невозможно, а разбираться и тратить лишнее время ни у кого желания нет вообще никакого.
                  Vitaliy
                  30 мая 2016, 12:59
                  0
                  <?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;
                  	}
                  }
                    Vitaliy
                    30 мая 2016, 13:51
                    0
                    Если недостаточно информации, то скажите, что еще нужно, я выложу. Спасибо.
                      Воеводский Михаил
                      30 мая 2016, 17:33
                      0
                      Этот код учитывает обнуляет стоимость доставки при достижении определенной суммы в корзине. Если доставка платная, то учитывается указанная стоимость доставки в свойствах метода доставки.
                      <?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;
                      	}
                      
                      }
                Vitaliy
                27 мая 2016, 17:29
                0
                Очень нужно решить этот вопрос, а то уже намучился с ним… Буду всем благодарен!
                  Николай
                  14 марта 2017, 16:13
                  0
                  сделал все по инструкции, но при выборе класса-обработчика выводит Ошибка
                  Код: 500 Internal Server Error, помогите как решить
                    Desler
                    24 ноября 2017, 16:25
                    0
                    Столкнулся с тем же, проблема решается если изменить путь подключения класса msDeliveryInterface в примере кода выше, а конкретно:
                    if(!class_exists('msDeliveryInterface')) {
                    	require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/msdeliveryhandler.class.php';
                    }
                    Andrew
                    19 ноября 2019, 17:28
                    0
                    Подскажите, кто нибудь решил проблему с 500 ошибкой?
                    Всё сделал по инструкции, пробовал разные варианты, но всё равно выдаёт 500 ошибку, а класс-обработчик прописать не даёт…
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      20