Последние темы


Плагин расчета скидки от суммы заказа

  • Доброго всем дня.
    Стоит следующая задача:
    Есть несколько цен: цена1 цена2 и т.д.
    Необходимо сделать плагин, который будет менять цену заказе в зависимости от цены.
    Например, если стоимость всего заказа достигает 30000 р. нужно подставить на все позиции заказа вместо цена1 цену2.
    Вот то, что пока написал, но не работает:

    /**
    * OnSHKsaveOrder
    *  
    * @internal    @events OnSHKcalcTotalPrice
    *
    */
    /*Функция для определения цены исходя из суммы заказанного товара*/
    
    if(!function_exists(Get_Price)){
    function Get_Price($id,$price_tota) {
     global $modx;
     $resource = $modx->getObject('modResource',array('id'=>$id));
     $price = $resource->getTVValue('price');//Значение TV-розничная цена
     $price2 = $resource->getTVValue('price_opt1');//оптовая цена при 30000
     $price3 = $resource->getTVValue('price_opt2');//оптовая цена при 60000
     $price4 = $resource->getTVValue('price_opt3');//оптовая цена при 90000
     $minzakaz_price1 = 30000;//опт минимальная цена 1
     $minzakaz_price2 = 60000;//опт минимальная цена 2
     $minzakaz_price3 = 90000;//опт минимальная цена 3
    
     if ($price_tota < $minzakaz_price1)  $price = $price; //цена до первой оптовой цены
     elseif ($price_tota >= $minzakaz_price1){
     	if ($price2 > 0) $price = $price2; /*цена, если больше или равно 30000 */
     }
     if ($price_tota >= $minzakaz_price2) $price = $price3;
     if ($price_tota >= $minzakaz_price3) $price = $price4;
       return $price;
     }
    }
    /*Собственно плагин, который повешен на OnSHKcalcTotalPrice*/
    if ($modx->event->name == 'OnSHKcalcTotalPrice'){
     if(!empty($_SESSION['shk_order'])){
       $purchases = $_SESSION['shk_order'];
      foreach($purchases as $key => $product){
     $id = $product['id']; 
             if (empty($id)) break;
    $id_tmp[$id]['id']= $key;
    $price = Get_Price($id,$price_tota);
    $_SESSION['shk_order'][$key]['price']=$price;
     }
    }
    $modx->event->_output = '';
    return '';
    }
    

    Подскажите в какую сторону смотреть

  • Изменение цены реализовал, все корректно.
    Вот код плагина:

    <?php
    /**
    * OnSHKsaveOrder
    *  
    * @internal    @events OnSHKcalcTotalPrice
    *
    */
    /*Функция для определения цены исходя из суммы заказанного товара*/
    
    if(!function_exists(Get_Price)){
    function Get_Price($id,$price_tota) {
     global $modx;
     $resource = $modx->getObject('modResource',array('id'=>$id));
     $price = $resource->getTVValue('price');//Значение TV-розничная цена
     $price2 = $resource->getTVValue('price_opt1');//оптовая цена при 30000
     $price3 = $resource->getTVValue('price_opt2');//оптовая цена при 60000
     $price4 = $resource->getTVValue('price_opt3');//оптовая цена при 90000
     $minzakaz_price1 = 30000;//опт минимальная цена 1
     $minzakaz_price2 = 60000;//опт минимальная цена 2
     $minzakaz_price3 = 90000;//опт минимальная цена 3
    
     if ($price_tota < $minzakaz_price1)  $price = $price; //цена до первой оптовой цены
     elseif ($price_tota >= $minzakaz_price1){
     	if ($price2 > 0) $price = $price2; /*цена, если больше или равно 30000 */
     }
     if ($price_tota >= $minzakaz_price2) $price = $price3;
     if ($price_tota >= $minzakaz_price3) $price = $price4;
       return $price;
     }
    }
    /*Собственно плагин, который повешен на OnSHKcalcTotalPrice*/
    if ($modx->event->name == 'OnSHKcalcTotalPrice'){
     if(!empty($_SESSION['shk_order'])){
       $purchases = $_SESSION['shk_order'];
      foreach($purchases as $key => $product){
     $id = $product['id']; 
             if (empty($id)) break;
    $id_tmp[$id]['id']= $key;
    $price = Get_Price($id,$price_total);
    $_SESSION['shk_order'][$key]['price']=$price;
     }
    }
    $modx->event->_output = '';
    return '';
    }
    

    Теперь другой вопрос.
    При пересчете корзины не выводится сумма заказа. Знатоки, как исправить?.

  • Решил вопрос, но через костыль. Почему-то сумма заказа из плагина не выводится в плэйсхолдер [[+price_total]], зато в любой другой за милую душу.
    Код плагина ниже, может кому пригодится:

    <?php
    /**
    * OnSHKsaveOrder
    *  
    * @internal    @events OnSHKcalcTotalPrice
    *
    */
    /*Функция для определения цены исходя из суммы заказанного товара*/
    
    if(!function_exists(Get_Price)){
    function Get_Price($id,$price_tota) {
    global $modx; 
     $resource = $modx->getObject('modResource',array('id'=>$id));
     $price = $resource->getTVValue('price');//Значение TV-розничная цена
     $price2 = $resource->getTVValue('price_opt1');//оптовая цена при 30000
     $price3 = $resource->getTVValue('price_opt2');//оптовая цена при 60000
     $price4 = $resource->getTVValue('price_opt3');//оптовая цена при 90000
     $minzakaz_price1 = 30000;//опт минимальная цена 1
     $minzakaz_price2 = 60000;//опт минимальная цена 2
     $minzakaz_price3 = 90000;//опт минимальная цена 3
    
     if ($price_tota < $minzakaz_price1)  $price = $price; //цена до первой оптовой цены
     elseif ($price_tota >= $minzakaz_price1){
     	if ($price2 > 0) $price = $price2; /*цена, если больше или равно 30000 */
     }
     if ($price_tota >= $minzakaz_price2) $price = $price3;
     if ($price_tota >= $minzakaz_price3) $price = $price4;
       return $price;
     }
    }
    /*Собственно плагин, который повешен на OnSHKcalcTotalPrice*/
    $e = &$modx->Event;
    if ($e->name == 'OnSHKcalcTotalPrice'){
     if(!empty($_SESSION['shk_order'])){
       $purchases = $_SESSION['shk_order'];
      foreach($purchases as $key => $product){
     $id = $product['id']; 
             if (empty($id)) break;
    $id_tmp[$id]['id']= $key;
    $tmp_prtotal=$price_total;
    $price = Get_Price($id,$tmp_prtotal);
    $_SESSION['shk_order'][$key]['price']=$price;
     }
    }
    $tot=$price_total;
    $modx->setPlaceholder('total', "$tot");
    }
    

    Прошу прощения за говнокод, приведу в порядок в ближайшее время.

 

Последние комментарии

  • Z

    Спасибо, действительно проще создать отдельно.

    Читать далее
  • Но проблема в том, что эта старая цена "дублируется" в плесхолдер "Дополнительных услуг" - [[+addit_data]].

    Можно не использовать [[+addit_data]], а выводить параметры по-отдельности.

    Цитата из документации:

    [[+shk_любой доп.параметр]] - любой доп. параметр, выбранный при добавлении товара в корзину (из [[+addit_data]]), например [[+shk_param1]].
    Если параметры сделаны в виде чекбоксов, то чтобы вывести отдельно каждый из них, нужно добавлять индекс (номер от нуля) для параметров следующих за первым.
    Пример: [[+shk_param1]], [[+shk_param1_1]], [[+shk_param1_2]] ...
    [[+shk_любой доп.параметр_price]] - цена доп.параметра. Пример: [[+shk_param1_price]].

    Читать далее
  • Z

    Доброго времени суток. Не могу разобраться, как передать данные migx-поля в корзину в плейсхолдер без "дублирования" в [[+addit_data]]
    Суть в чем: У меня есть 2 цены у товара (со скидкой и без скидки) Форма для отправки в корзину:

    <form action="[[~[[*resource_id]]? &scheme=`abs`]][[*alias]].html" method="post"> <input type="hidden" name="shk-id" value="[[*id]]" /> <input type="hidden" name="shk-name" value="[[*pagetitle]]" /> <input type="hidden" name="price_old__[[*id]]__add" value="[[*price_old]]" /> <input type="hidden" name="shk-count" value="1" /> <div class="product-price"> Цена: <span class="shk-price">[[!*price:shk_curr_rate:num_format]]</span> Старая цена - <span class="shk-price-old">[[+price_old]]</span> [[!+shk_currency]] </div> <div class="padding-lr-30"> <h5>Дополнительные услуги</h5> [[*param1]] </div> <div class="product-price"> <button class="btn btn-lg btn-primary" type="submit" class="shk-but">В корзину</button> </div> </form>

    Данные со "старой ценой" в корзину попадают нормально и выводится в нужном месте в плейсхолдере:
    [[+shk_price_old]]
    Но проблема в том, что эта старая цена "дублируется" в плесхолдер "Дополнительных услуг" - [[+addit_data]]. Как сделать чтобы старая цена не выводилась в [[+addit_data]]? Или может я как то не правильно передаю MIGX-параметр в корзину ? Заранее спасибо.

    Читать далее
  • Фотографии, как я понял, это второй вопрос. Я по нему пока ничего не отвечал и не просил информации. Это не отменяет того, что в вашем конфиге есть ошибка, о которой я писал выше. Не нужно задавать разные вопросы в одной теме, чтобы не было путаницы.
    http://forum.modx-shopkeeper.ru/topic/15/рекомендации-по-оформлению-темы-с-вопросом

    Читать далее