Скидка на товар в зависимости от суммы в корзине minishop2

Здравствуйте, подскажите может кто то делал что то похожее или может есть готовое решение. Есть определенный товар в магазине minishop2 стоимость его 500 р но если в корзине сумма на 1000 р то он должен стоить 100 р
eflit
04 сентября 2019, 23:56
modx.pro
1
136
0
Поблагодарить автора Отправить деньги

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

ElenaLelo
05 сентября 2019, 09:34
+2
Я делала при помощи данного плагина. К товару добавляете два ТВ поля/опции, 1-я опция — цена товара. 2-я — количество/сумма при котором данная цена срабатывает. Получаете эти данные в плагине, сравниваете и выводите цену которая нужна Вам.
switch ($modx->event->name) {
    case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
    $tmp = $cart->get(); //Получаем информацию о козине - т.е. список товаров
    //$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($tmp, true)); // Используем лог для того чтобы хоть какую-то понимать с чем мы работаем:) (пишется в файл core/cache/logs/error.log)
    foreach ($tmp as $key1 => $value) {
        // Тут "бизнес логика" конкретно этого сайта, она может быть любая по сути.
            if ($product = $modx->getObject('msProduct', $value['id'])) {
                $quantity = $value['count']; // получаем кол-во товара в корзине
                if ($quantity > 499) {
                    $tmp[$key1]['price'] = $product->get('price500');
                }
                elseif ($quantity > 99) {
                    $tmp[$key1]['price'] = $product->get('price100');
                }
                elseif ($quantity > 49) {
                    $tmp[$key1]['price'] = $product->get('price50');
                }
                elseif ($quantity > 9) {
                    $tmp[$key1]['price'] = $product->get('price10');
                }
                elseif ($quantity > 4) {
                    $tmp[$key1]['price'] = $product->get('price5');
                }
                else {
                    $realPrice = $product->get('price1');
                    $tmp[$key1]['price'] = $realPrice; // Устанавливаем новую цену для товара в корзине
                }
            }
        }
    //$modx->log(xPDO::LOG_LEVEL_ERROR, $realPrice);
    $cart->set($tmp); //Записываем данные в корзину
    break;
}
    eflit
    05 сентября 2019, 11:13
    0
    Спасибо. А подскажите еще а таким образом $product->get('price500'); мы будем получать значение tv 'price500?
      ElenaLelo
      05 сентября 2019, 13:58
      +1
      $product->get('price500'); — получение опции price500
      $product->getTVValue('price500'); — получении ТВ поля price500
        eflit
        05 сентября 2019, 14:13
        0
        Спасибо все уже разобрался.
    Андрей Шевяков
    06 сентября 2019, 09:26
    0
      eflit
      06 сентября 2019, 11:03
      0
      Спасибо задачу решили а готовое решение что вы предложили оно работает только в админке.
        iWatchYouFromAfar
        06 сентября 2019, 11:24
        0
        Опубликуйте свое решение, чтобы другие не завали этот же вопрос.
          eflit
          06 сентября 2019, 11:33
          0
          Вот решение но я его еще дорабатываю так как есть косяки
          <?php
          switch ($modx->event->name) {
              case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
              $tmp = $cart->get(); //Получаем информацию о козине - т.е. список товаров
              //$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($tmp, true)); // Используем лог для того чтобы хоть какую-то понимать с чем мы работаем:) (пишется в файл core/cache/logs/error.log)
                      
              foreach ($tmp as $value) {
                  if ($value['id']!=753) {
                  $colihestvo = $value['count']; // получаем кол-во товара в корзине
                  $cena = $value['price']; // получаем цену товара в корзине
                  $summa = $colihestvo * $cena;
                  $summaob = $summaob + $summa;
                  } 
              }
              
              
              
              foreach ($tmp as $key1 => $value) {
                  if ($value['id']==753) {
                  // Тут "бизнес логика" конкретно этого сайта, она может быть любая по сути.
                      if ($product = $modx->getObject('msProduct', $value['id'])) {
                          $quantity = $summaob;
                          $suuman = $product->getTVValue('summa');
          
                          if ($quantity > $suuman) {
                              $tmp[$key1]['price'] = $product->getTVValue('price1');
                          }
                          else {
                              $realPrice = $product->get('price');
                              $tmp[$key1]['price'] = $realPrice; // Устанавливаем новую цену для товара в корзине
                          }
                      }
                  }
                  }
              //$modx->log(xPDO::LOG_LEVEL_ERROR, $realPrice);
              $cart->set($tmp); //Записываем данные в корзину
              break;
          }
            Кирилл
            06 сентября 2019, 17:57
            0
            У тебя там в комментариях даже путаница.
            // Устанавливаем новую цену для товара в корзине
            должно быть в блоке if. А все, что в else — думаю понятно.
              eflit
              07 сентября 2019, 00:23
              0
              Я же написал что нужно доработать на комменты не смотрите
              <?php
              switch ($modx->event->name) {
                  case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
                  $tmp = $cart->get(); 
                  foreach ($tmp as $value) {
                      if ($value['id']!=753) {
                      $colihestvo = $value['count'];
                      $cena = $value['price'];
                      $summa = $colihestvo * $cena;
                      $summaob = $summaob + $summa;
                      } 
                  }
                  
                  foreach ($tmp as $key1 => $value) {
                      if ($value['id']==753) {
                          if ($product = $modx->getObject('msProduct', $value['id'])) {
                              $quantity = $summaob;
                              $suuman = $product->get('weight');
              
                              if ($quantity > $suuman) {
                                  $tmp[$key1]['price'] = $product->get('old_price');
                              }
                              else {
                                  $realPrice = $product->get('price');
                                  $tmp[$key1]['price'] = $realPrice;
                              }
                          }
                      }   
                      }
                  //$modx->log(xPDO::LOG_LEVEL_ERROR, $realPrice);
                  $cart->set($tmp);
                  break;
              }
      Mr.Prop
      09 сентября 2019, 03:14
      0
      switch ($modx->event->name) {
          case 'msOnAddToCart': 
          case 'msOnChangeInCart': 
          case 'msOnRemoveFromCart': 
      // Обрабатывать только события добавления товара в корзину, изменения количества и удаления
      
      // Получаем массив корзины
              $cartArray = $cart->get();
      
      // Обрабатываем все товары корзины        
              foreach ($cartArray as &$cartPr) {
      // Получаем объект "товар" по его ID в корзине
                  if ($product = $modx->getObject('msProduct', $cartPr['id'])) {
      // Получаем цену каждого товара в корзине
                      $cartPr['price'] = $product->get('price');
      // Получаем сумму каждого товара в корзине
                      $cartPr['sum'] = $cartPr['count'] * $cartPr['price'];
      //Проверяем id товара (705) и его сумму (больше или равно 1000р.)
                      if ($cartPr['id'] == 705 && $cartPr['sum'] >= 1000) {
      // Если условие совпало, то назначаем новую цену 100 р.
                         $cartPr['price'] = 100;
                      }
                  }
              }
      }
      Чтобы увидеть изменение цены находясь в корзине необходимо перезагрузить корзину.
      О том, как это сделать можно посмотреть здесь modx.pro/help/3898#comment-113583

      P.S. Совсем не программист, просто интересуюсь.
      Надеюсь, что кому-то сэкономил время.
        Mr.Prop
        09 сентября 2019, 03:17
        0
        Удачи!
          Mr.Prop
          09 сентября 2019, 03:32
          0
          Если нужно сравнить с общей суммой всей корзины. то немного переделываем

          switch ($modx->event->name) {
              case 'msOnAddToCart': 
              case 'msOnChangeInCart': 
              case 'msOnRemoveFromCart': 
          // Обрабатывать только события добавления товара в корзину, изменения количества и удаления
          
          // Получаем массив корзины
                  $cartArray = $cart->get();
          
          // Обрабатываем все товары корзины        
                  foreach ($cartArray as &$cartPr) {
          // Получаем объект "товар" по его ID в корзине
                      if ($product = $modx->getObject('msProduct', $cartPr['id'])) {
          // Получаем цену каждого товара в корзине
                          $cartPr['price'] = $product->get('price');
          // Получаем сумму всей корзины (появился знак плюс перед равно)
                          $cartPr['sum'] += $cartPr['count'] * $cartPr['price'];
          //Проверяем id товара (705) и сумму всей корзины (больше или равно 1000р.)
                          if ($cartPr['id'] == 705 && $cartPr['sum'] >= 1000) {
          // Если условие совпало, то назначаем новую цену 100р.
                             $cartPr['price'] = 100;
                          }
                      }
                  }
          }
          P.S. Совсем не программист, просто интересуюсь.
          Надеюсь, что кому-то сэкономил время.
            Mr.Prop
            09 сентября 2019, 03:42
            0
            Забыл указать, что оба кода нужно поместить в плагин и повесить его на указанные в коде события.
            msOnAddToCart
            msOnChangeInCart
            msOnRemoveFromCart
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              14