Разная цена в зависимости от кол-во товара



  • При добавлении товара в корзину при заказе больше определенного количества нужно изменить (уменьшить цену). Есть ли готовое решение или поставте на путь правильный.
    Shopkeeper 3



  • @Aligan Скорей всего param-edit. Описание есть в документации Shopkeeper на него.


  • Администраторы

    Написать плагин на какое-нибудь подходящее событие
    http://wiki.modx-shopkeeper.ru/doku.php?id=shk3_docs#события_для_плагинов



  • @Andchir Данный плагин для изменения цены, в зависимости от количества, работает хорошо. Но на страницах, где есть вызов корзины, после добавления товара в корзину, появляется ошибка. Просто текст: C:/OpenServer/domains/mysite/core/components/shopkeeper3/elements/tv/output/ . Подскажите , пожалуйста, как можно решить эту проблему.

    <?php
    /*Функция для определения цены исходя из указанного кол-ва товара*/
    if(!function_exists(Get_Price)){
    function Get_Price($id,$count) {
      global $modx;
      $resource = $modx->getObject('modResource',array('id'=>$id));
      $price = $resource->getTVValue('price');
      $price2 = $resource->getTVValue('oldprice');
    
      if ($count < 5)  $price = $price; //цена до 5 штук
      
      elseif ($count >= 5){
      	if ($price2 > 0) $price = $price2; //больше или равно 5
      }
         return $price;
      }
    }
    
    /*Собственно плагин, который повешен на OnSHKbeforeCartLoad*/
    if ($modx->event->name == 'OnSHKbeforeCartLoad'){
      
      if(!empty($_SESSION['shk_order'])){
       
        $purchases = $_SESSION['shk_order'];
    
    	foreach($purchases as $key => $product){
    
    	  $id = $product['id']; 
              if (empty($id)) break;
    	  $count=$product['count'];
    		if (isset($id_tmp[$id])) {
    			$count= $id_tmp[$id]['count']+$count;
    			$uns=$id_tmp[$id]['id'];
    			unset ($_SESSION['shk_order'][$uns]);
    
    		} 
    		$id_tmp[$id]['id']= $key;
    		$id_tmp[$id]['count']=$count;
    		$price = Get_Price($id,$count);
    		$_SESSION['shk_order'][$key]['price']=$price;
    		$_SESSION['shk_order'][$key]['count']=$count;
    	}
      }
    }
    

  • Администраторы

    @laguna404
    Попробуйте в конце кода плагина добавить:

    $modx->event->_output = '';
    return '';
    


  • @Andchir Спасибо, помогло. Доработал плагин для розничной и оптовой цены с минимальным количеством товара для опта. При желании можно добавить сколько угодно цен и использовать как скидку при заказе определенного кол-ва , отрегулировав функцию Get_Price.
    Для ресурсов MODX:

    <?php
    /*Функция для определения цены исходя из заказанного кол-ва товара*/
    if(!function_exists(Get_Price)){
    function Get_Price($id,$count) {
      global $modx;
      $resource = $modx->getObject('modResource',array('id'=>$id));
      $price = $resource->getTVValue('price');//Значение TV-розничная цена
      $price2 = $resource->getTVValue('optprice');//оптовая цена
      $minzakaz = $resource->getTVValue('minzakaz');//опт минимальное кол-во 
    
      if ($count < $minzakaz)  $price = $price; //цена до $minzakaz штук
      elseif ($count >= $minzakaz){
      	if ($price2 > 0) $price = $price2; /*цена, если больше или равно $minzakaz штук */
      }
        return $price;
      }
    }
    /*Собственно плагин, который повешен на OnSHKbeforeCartLoad*/
    if ($modx->event->name == 'OnSHKbeforeCartLoad'){
      if(!empty($_SESSION['shk_order'])){
        $purchases = $_SESSION['shk_order'];
    	foreach($purchases as $key => $product){
    	  $id = $product['id']; 
              if (empty($id)) break;
    	  $count=$product['count'];
    		if (isset($id_tmp[$id])) {
    			$count= $id_tmp[$id]['count']+$count;
    			$uns=$id_tmp[$id]['id'];
    			unset ($_SESSION['shk_order'][$uns]);
    		} 
    		$id_tmp[$id]['id']= $key;
    		$id_tmp[$id]['count']=$count;
    		$price = Get_Price($id,$count);
    		$_SESSION['shk_order'][$key]['price']=$price;
    		$_SESSION['shk_order'][$key]['count']=$count;
    	}
      }
    $modx->event->_output = '';
    return '';
    }
    

    Для товаров из отдельной таблицы MIGXdb:

    <?php
    /*Функция для определения цены исходя из заказанного кол-ва товара*/
    if(!function_exists(Get_Price)){
    function Get_Price($id,$count) {
    global $modx;
     //Добавить свой package
    $base_path = !empty($base_path) ? $base_path : $modx->getOption('core_path').'components/shop/';
    $modx->addPackage('shop', $base_path.'model/');
    /*Выбираем значение полей таблицы shop_content*/
    $resource = $modx->getObject('ShopContent',array('id'=>$id));
    $price = $resource->get('price');//розничная цена
    $price2 = $resource->get('price2');//оптовая цена
    $minzakaz = $resource->get('min_optzakaz');/*Кол-во товара - минимальный опт*/
    
      if ($count < $minzakaz)  $price = $price; //цена до $minzakaz штук
      elseif ($count >= $minzakaz){
      	if ($price2 > 0) $price = $price2; //цена, если больше или равно $minzakaz штук
      }
         return $price;
      }
    }
    /*Собственно плагин, который повешен на OnSHKbeforeCartLoad*/
    if ($modx->event->name == 'OnSHKbeforeCartLoad'){
      if(!empty($_SESSION['shk_order'])){
        $purchases = $_SESSION['shk_order'];
    	foreach($purchases as $key => $product){
    	  $id = $product['id']; 
              if (empty($id)) break;
    	  $count=$product['count'];
    		if (isset($id_tmp[$id])) {
    			$count= $id_tmp[$id]['count']+$count;
    			$uns=$id_tmp[$id]['id'];
    			unset ($_SESSION['shk_order'][$uns]);
    		} 
    		$id_tmp[$id]['id']= $key;
    		$id_tmp[$id]['count']=$count;
    		$price = Get_Price($id,$count);
    		$_SESSION['shk_order'][$key]['price']=$price;
    		$_SESSION['shk_order'][$key]['count']=$count;
    	}
      }
    $modx->event->_output = '';
    return '';
    }
    

    Не знаю насколько оптимальный способ выборки значений полей MIGX, но работает.



  • А для Shopkeeper 2, что бы заработало, что нужно исправить? Заранее спасибо!





  • Еще раз доработал плагин. Теперь плагин меняет цены, в зависимости от количества, с учетом товаров с дополнительными параметрами.
    Например, вы определили розничную, оптовую цену и минимальное количество для оптового заказа.
    Покупатель кладет в корзину товары с разными размерами (дополнительными параметрами). Получается несколько позиций в корзине. Если в сумме количество со всех позиций одного товара (id) достигло минимального оптового, то цена на всех позициях (данного id) меняется на оптовую.
    Если установлена цена для дополнительного параметра, то она не меняется. Меняется только базовая цена.

    Плагин для товаров из отдельной таблицы MIGXdb:

    <?php
    /*Функция для определения цены исходя из заказанного кол-ва товара*/
    if(!function_exists(Get_Price)){
    function Get_Price($id,$counts) {
    global $modx;
     //Добавить свой package
    $base_path = !empty($base_path) ? $base_path : $modx->getOption('core_path').'components/shop/';
    $modx->addPackage('shop', $base_path.'model/');
    /*Выбираем значение полей таблицы shop_content*/
        $resource = $modx->getObject('ShopContent',array('id'=>$id));
        $price = $resource->get('price');//розничная цена
        $price2 = $resource->get('price2');//оптовая цена
        $minzacaz = $resource->get('minzacaz');/*Кол-во товара - минимальный опт*/
      if ($counts < $minzacaz)  $price = $price; //цена до $minсaсaz штук
          elseif ($counts >= $minzacaz){
          if ($price2 > 0) $price = $price2; //цена, если больше или равно $minzaсaz
          }
        return $price;
      }
    }
    /*Функция для определения количества товара (одного id) с различными параметрами в корзине*/
    if(!function_exists(Get_Count)){
        function Get_Count($id){
        $tovar = $_SESSION['shk_order'];
            foreach($tovar as $key => $product){//перебираем товар
            if ($product['id']==$id) $counts=$product['count']+$counts;//если товар имеет тот же id, прибавляем его кол-во к общему кол-ву
            }
        return $counts;//общее количество товаров c переданным в функцию id  
        }
    }
    /*Собственно сам плагин, который повешен на OnSHKbeforeCartLoad*/
    if ($modx->event->name == 'OnSHKbeforeCartLoad'){
      if(!empty($_SESSION['shk_order'])){ 
        $purchases = $_SESSION['shk_order'];//получаем массив с товарами в корзине
    	foreach($purchases as $key => $product){//перебираем товар
    	    $id = $product['id'];//получаем id текущего товара
            $counts=Get_Count($id);//передаем id в функцию, выясняем сколько всего товаров с этим id в корзине 
    		$price = Get_Price($id,$counts);//передаем id и общее кол-во в функцию для определения цены
    		$_SESSION['shk_order'][$key]['price']=$price;//записываем цену для товаров с этим id
    	}
      }
    $modx->event->_output = '';
    return '';
     }
    
    

    Для товаров из ресурсов MODX надо заменить функцию Get_Price на:

    <?php
    /*Функция для определения цены исходя из заказанного кол-ва товара*/
    if(!function_exists(Get_Price)){
    function Get_Price($id,$counts) {
      global $modx;
      $resource = $modx->getObject('modResource',array('id'=>$id));
      $price = $resource->getTVValue('price');//Значение TV-розничная цена
      $price2 = $resource->getTVValue('price2');//оптовая цена
      $minzacaz = $resource->getTVValue('minzacaz');//опт минимальное кол-во 
      if ($counts < $minzacaz)  $price = $price; //цена до $minzacaz штук
      elseif ($counts >= $minzacaz){
      	if ($price2 > 0) $price = $price2; //цена, если больше или равно $minzacaz
      }
        return $price;
      }
    }
    


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

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.