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
5
6 207
0

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

Игорь Терентьев
18 марта 2016, 12:23
0
Стоимость доставки: <span id="ms2_delivery_cost">[[+delivery_cost]]</span> руб.
    Безнос Евгений
    20 марта 2016, 23:18
    0
    Игорь, спасибо большое за ответ.
    Я вставил это span в чанк tpl.msOrder.outer MiniShop2, но значение [[+delivery_cost]] пусто.
      Игорь Терентьев
      21 марта 2016, 06:23
      0
      У меня работает. Вот чанк целиком:
      <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
        2
        0
        Разобрался в чем дело) У вас видимо кастомный класс 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
          0
          Отлично! Да, у меня msOrder установлен.
            Sergey (Sentinel)
            17 января 2019, 18:32
            0
            Что то у меня не работает этот вариант. Версия minishop 2.4.17-pl
            Пишет 0 всегда, даже если доставка указана…
              Юрий
              23 января 2019, 18:04
              0
              Может кастомный класс не зарегистрирован?
                Sergey (Sentinel)
                23 января 2019, 18:32
                0
                Возможно… но у меня зарегистрирован класс доставки
                я в него просто код вставляю, но не хочет отдельно доставка выводится… пишет 0 и все…
                  Юрий
                  23 января 2019, 18:40
                  0
                  метод getCost класса доставки не передает стоимость доставки на страницу заказа. Это делает класс msOrder, который в своем методе getCost складывает ее со стоимостью товаров в корзине и выводит на страницу заказа.
                    Sergey (Sentinel)
                    23 января 2019, 18:45
                    0
                    Я вот теперь запутался, как мне грамотно прописать, чтобы все работало… мне нужно чтобы мой расширенный класс тоже работал
                    В ms2 у доставки в поле Класс-обработчик ведь только один класс можно выбрать…
                      Юрий
                      23 января 2019, 18:56
                      0
                      Через кастомный msOrder и небольшие изменения в JS. Кастомный msOrder регистрируется в разделе minishop2 системных настроек.
                        Sergey (Sentinel)
                        23 января 2019, 19:21
                        0
                        Т.е. мне нужно этот класс переопределить?
                        Юрий
                        23 января 2019, 19:28
                        1
                        +1
                        Либо переопределить сам класс, написав кастомный, либо переопределить только метод getCost в кастомном классе, что логичнее.
                        Метод подключения кстомного класса из инструкции не работает. Поэтому в графу «класс обработчик заказа» нужно вписать название вашего кастомного класса.
                        Юрий
                        23 января 2019, 19:47
                        0
                        И еще стоит упомянуть, что раз уж метод из инструкции не работает и мы пользуемся старым методом подключения кастомного класса, то соответствующий файл должен лежать в директории core\components\minishop2\custom\order
                    Петр
                    15 октября 2019, 18:25
                    0
                    Всем привет!
                    Что-то я запутался… У меня метод 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