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


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

  • При добавлении товара в корзину при заказе больше определенного количества нужно изменить (уменьшить цену). Есть ли готовое решение или поставте на путь правильный.
    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;
      }
    }
    
 

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

  • Я не знаю как тебе объяснить, что твой продукт гавно. Что шопкипер, что catalogfil - полное кривое гавно

    Зачем ты мучаешь себя? Не пользуйся. Другие продукты тоже все "говно", или может говно у тебя в голове?

    Ты хоть сам тестировал свою хрень в подобной ситуации? Нормальный функционал и документацию ты сделать поленился

    Много я таких как ты встречал. У вас всегда кто-то другой виноват. До таких "умников" даже не доходит, что в продукте может отсутствовать требуемый им функционал. И это нормально. Ты хотел многофункциональный комбайн за 500 руб? Я подсказываю обходные пути, но для тебя это слишком сложно (это я про другие темы этого автора).

    видимо с той целью что бы выклянчить копеечку

    С таких как ты мне ничего не надо. Лучше просто забудь о существовании Шопкипера и CatalogFill.

    Давай отвечай

    Зачем мне это? Ни за один ответ я не получил от тебя даже "спасибо".

    или просто кинь ещё 1 бан, хоть власть почувствуешь)))

    Моему терпению можно только позавидовать. Ты заслужил бан уже очень давно.

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

    @Andchir Я не знаю как тебе объяснить, что твой продукт гавно. Что шопкипер, что catalogfil - полное кривое гавно. Я тебе пытаюсь объяснить, что товар или добавляется дублями или изменяются параметры у товаров с таким же артикулом, ты же мне рассказываешь про кнопочки "Добавить" и "Обновить". Ты хоть сам тестировал свою хрень в подобной ситуации? Нормальный функционал и документацию ты сделать поленился, видимо с той целью что бы выклянчить копеечку. Все эти функции должны были быть описаны в документации. Есть демо сайт, есть галерея в нём, значит и импорт должен производиться под этот сайт и всё было бы понятно. Давай отвечай или просто кинь ещё 1 бан, хоть власть почувствуешь)))

    P.S: Весь мой вопрос можно было решить за 1 день, после первого поста.

    Читать далее
  • Ещё один момент, если вам нужно добавить товар, то нужно нужно переключатель "Тип импорта" ставить в положение "Добавить". Но делаете ли вы так - такой информации я тоже не увидел. Вытаскивать из вас информацию по кусочкам - слишком долго.

    Читать далее
  • Вы отправляетесь в бан на 2 дня. Каждый раз одно и то же. Мне не нужна информация сколько вы раз возвращали резервную копию. Но нужен полный конфиг, а не кусочки. При этом нормальная информация "делаю так - получаю так", а не "получаю так или так" (не известно при каких действиях).

    У меня изначально стоял параметр false, я пробую и так и сяк

    Не нужно пробовать "так и сяк", нужно делать так как написано и так как правильно по смыслу описания параметров. После этого писать на форуме, что "делаю как должно быть, но получается не так". Если вы что-то пробуете, что вообще не правильно по смыслу, то мне об этом писать не нужно.

    Читать далее