К содержанию

Cтоимость способа доставки в MS2

Всем привет!
В стандартном чанке tpl.msOrder.outer MiniShop2 есть такой блок:
<h3>[[%ms2_frontend_order_cost]]: <span id="ms2_order_cost">[[+order_cost:default=`0`]]</span>
                [[%ms2_frontend_currency]]</h3>
в placeholder [[+order_cost]] уже включена стоимость выбранного способа доставки.
Подскажите пожалуйста как вывести отдельно стоимость доставки?
Безнос Евгений
Безнос Евгений
18 марта 2016, 00:15
modx.pro
7 491
Реклама

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

Игорь Терентьев
Игорь Терентьев Проверенный
18 марта 2016, 12:23
Стоимость доставки: <span id="ms2_delivery_cost">[[+delivery_cost]]</span> руб.
    Безнос Евгений
    Безнос Евгений Старожил
    20 марта 2016, 23:18
    Игорь, спасибо большое за ответ.
    Я вставил это span в чанк tpl.msOrder.outer MiniShop2, но значение [[+delivery_cost]] пусто.
      Игорь Терентьев
      Игорь Терентьев Проверенный
      21 марта 2016, 06:23
      У меня работает. Вот чанк целиком:
      <form class="form-horizontal ms2_form" id="msOrder" method="post">
          <div class="row">
              <div class="col-md-6 basketcol" id="recieve_data">
                  <h3>Данные получателя:</h3>
                  <div class="form-group input-parent">
                      <label class="col-sm-4 control-label" for="email"><span class="required-star">*</span> Email</label>
                      <div class="col-sm-6">
                          <input type="email" id="email" placeholder="[[%ms2_frontend_email]]" name="email" value="[[!GET?param=`mail`]][[+email]]" class="form-control field [[+errors.email]]">
                      </div>
                  </div>
                  <div class="form-group input-parent">
                      <label class="col-sm-4 control-label"  for="phone"><span class="required-star">*</span> Телефон</label>
                      <div class="col-sm-6">
                          <input type="text" id="phone" placeholder="[[%ms2_frontend_phone]]" name="phone" value="[[!GET:stripString=`+`?param=`tel`]][[+phone]]" class="form-control field [[+errors.phone]]">
                      </div>
                  </div>
                  <div class="form-group input-parent">
                      <label class="col-sm-4 control-label"  for="comment"><span class="required-star">*</span> Комментарий</label>
                      <div class="col-sm-6">
                          <textarea name="comment" id="comment" placeholder="[[%ms2_frontend_comment]]" class="form-control [[+errors.comment]]">[[+comment]]</textarea>
                      </div>
                  </div>
              </div>
      
              <div class="col-md-6 basketcol1" id="deliveries">
                  <h3>Варианты доставки:</h3>
                  <div class="form-group">
                      <label class="col-sm-4 control-label" ><span class="required-star">*</span> Выберите доставку</label>
                      <div class="col-sm-6">
                          [[+deliveries]]
                      </div>
                  </div>
                  [[!msOrderSpot?
                      &limit=`300`
                      &firstName=`Введите название`
                  ]]
                  <div class="form-group input-parent">
                  
      				<label class="col-sm-4 control-label"  for="region"><span class="required-star">*</span> Дата доставки</label>
      				<div class="col-sm-6">
      					<input type="date" id="region" placeholder="Введите дату доставки" name="region" value="[[+region]]" class="form-control field [[+errors.region]]">
      				</div>
      			</div>
              </div>
          </div>
          
          <div id="result-cart">
              <div class="col-md-offset-2">
                  <span id="deliveryprice">Стоимость доставки: <span id="ms2_delivery_cost">[[+delivery_cost]]</span> руб.</span>
                  <span id="ms2_delivery_notify">[[+delivery_notify]]</span>
                  <span id="ms2_delivery_error">[[+delivery_error]]</span>
                  <span id="ms2_spot_description">[[+spot_description]]</span>
                  <span id="ms2_spot_address">[[+spot_address]]</span>
                  <span id="totalprice">Итого, с доставкой: <span id="ms2_order_cost">[[+order_cost:default=`0`]]</span> руб.</span>
                  <span style="font-size: 18px;">Хотите оформить заказ?</span> <button type="submit" name="ms2_action" value="order/submit" class="buylink ms2_link">Да!</button>
              </div>
          </div>
      </form>
        Безнос Евгений
        Безнос Евгений Старожил
        22 марта 2016, 00:54
        Разобрался в чем дело) У вас видимо кастомный класс msorderhandler.class.php
        Я добавил свой класс наследовал его от msOrderHandler и переопределил метод getCost() добавил в код пару строчек смотри комментарии:
        public function getCost($with_cart = true, $only_cost = false) {
        		$response = $this->ms2->invokeEvent('msOnBeforeGetOrderCost', array(
        			'order' => $this,
        			'cart' => $this->ms2->cart,
        			'with_cart' => $with_cart,
        			'only_cost' => $only_cost,
        		));
        		if (!$response['success']) {return $this->error($response['message']);}
        
        		$cart = $this->ms2->cart->status();
        		$cost = $with_cart
        			? $cart['total_cost']
        			: 0;
        
        		/* @var msDelivery $delivery */
        		if (!empty($this->order['delivery']) && $delivery = $this->modx->getObject('msDelivery', $this->order['delivery'])) {
        			$cost = $delivery->getCost($this, $cost);
        			$deliveryCost = $delivery->getCost($this, 0);//Добавил переменную где получаем price доставки
        		}
        
        		/* @var msPayment $payment */
        		if (!empty($this->order['payment']) && $payment = $this->modx->getObject('msPayment', $this->order['payment'])) {
        			$cost = $payment->getCost($this, $cost);
        		}
                
        		$response = $this->ms2->invokeEvent('msOnGetOrderCost', array(
        			'order' => $this,
        			'cart' => $this->ms2->cart,
        			'with_cart' => $with_cart,
        			'only_cost' => $only_cost,
        			'cost' => $cost
        		));
        		if (!$response['success']) {return $this->error($response['message']);}
        		$cost = $response['data']['cost'];
        
        		return $only_cost
        			? $cost
        			: $this->success('', array('cost' => $cost, 'delivery_cost'=>$deliveryCost));//Добавил deliveryCost
        	}
        Далее добавил скрипт на страницу заказа:
        miniShop2.Order.deliveryCost = '#ms2_delivery_cost';
        
        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');
        }
        
        miniShop2.Callbacks.Order.getcost.response.error = function(response) {
        
            var cost = response.data['cost'];
        
            $(miniShop2.Order.orderCost).text(miniShop2.Utils.formatPrice(cost));
            $(miniShop2.Order.deliveryCost, miniShop2.Order.order).text('0');
        }
        
        miniShop2.Callbacks.Order.add.response.success = function(response) {
             miniShop2.Order.getcost();
            }
        и в чанке tpl.msOrder.outer вставил span
        <span id="deliveryprice">Стоимость доставки: <span id="ms2_delivery_cost"></span> руб.</span>
        При таком раскладе placeholder [[+delivery_cost]] ненужен, я думаю что такого placeholdera в ms2 нет. delivery_cost есть в схеме БД (core/components/minishop2/model/schema/minishop2.mysql.schema.xml) ms2 больше ни где не видел)
          Игорь Терентьев
          Игорь Терентьев Проверенный
          22 марта 2016, 06:14
          Отлично! Да, у меня msOrder установлен.
            Sergey (Sentinel)
            Sergey (Sentinel) Проверенный
            17 января 2019, 18:32
            Что то у меня не работает этот вариант. Версия minishop 2.4.17-pl
            Пишет 0 всегда, даже если доставка указана…
              Юрий
              Юрий Старожил
              23 января 2019, 18:04
              Может кастомный класс не зарегистрирован?
                Sergey (Sentinel)
                Sergey (Sentinel) Проверенный
                23 января 2019, 18:32
                Возможно… но у меня зарегистрирован класс доставки
                я в него просто код вставляю, но не хочет отдельно доставка выводится… пишет 0 и все…
                  Юрий
                  Юрий Старожил
                  23 января 2019, 18:40
                  метод getCost класса доставки не передает стоимость доставки на страницу заказа. Это делает класс msOrder, который в своем методе getCost складывает ее со стоимостью товаров в корзине и выводит на страницу заказа.
                    Sergey (Sentinel)
                    Sergey (Sentinel) Проверенный
                    23 января 2019, 18:45
                    Я вот теперь запутался, как мне грамотно прописать, чтобы все работало… мне нужно чтобы мой расширенный класс тоже работал
                    В ms2 у доставки в поле Класс-обработчик ведь только один класс можно выбрать…
                      Юрий
                      Юрий Старожил
                      23 января 2019, 18:56
                      Через кастомный msOrder и небольшие изменения в JS. Кастомный msOrder регистрируется в разделе minishop2 системных настроек.
                        Sergey (Sentinel)
                        Sergey (Sentinel) Проверенный
                        23 января 2019, 19:21
                        Т.е. мне нужно этот класс переопределить?
                        Юрий
                        Юрий Старожил
                        23 января 2019, 19:28
                        Либо переопределить сам класс, написав кастомный, либо переопределить только метод getCost в кастомном классе, что логичнее.
                        Метод подключения кстомного класса из инструкции не работает. Поэтому в графу «класс обработчик заказа» нужно вписать название вашего кастомного класса.
                        Юрий
                        Юрий Старожил
                        23 января 2019, 19:47
                        И еще стоит упомянуть, что раз уж метод из инструкции не работает и мы пользуемся старым методом подключения кастомного класса, то соответствующий файл должен лежать в директории core\components\minishop2\custom\order
                    Петр
                    Петр Старожил
                    15 октября 2019, 18:25
                    Всем привет!
                    Что-то я запутался… У меня метод getCost кастомного класса доставки возвращает на страницу оформления заказа Полную стоимость заказа со стоимостью доставки. При этом, как пишет Юрий, метод getCost кастомного класса msOrder также возвращает сумму стоимости доставки и стоимость товаров в корзине.
                    Как же по «фэншую» вернуть на страницу оформления заказа стоимость доставки отдельно от полной стоимости заказа с доставкой?
                    Я использовал «Метод подключения кастомного класса из инструкции».
                    class PlastekNew extends msDeliveryHandler implements msDeliveryInterface
                    {
                        public function getCost(msOrderInterface $order, msDelivery $delivery, $cost = 0)
                        {
                        $xxx = 300; // Типа что-то там себе посчитали... $xxx - стоимость доставки
                        $cart = $this->ms2->cart->status(); // Получили данные о содержимом корзины
                        $total_cost = $xxx + $cart['total_cost']; // Подсчитали Итого
                        return $total_cost; // Вернули Итого, и Итого отобразилось в форме оформления заказа - чанк tpl.msOrder
                        }
                    }
                    action.php передает {deliveryCost: -1, cost: 1449, period: 0, delivery: 7},
                    где cost = 1149 (Стоимость всех товаров в корзине $cart['total_cost']) + 300 (стоимость доставки $xxx), delivery = 7 (id способа доставки в minishop2)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      15