Разные скидки в зависимости от количества товаров

Описан алгоритм для модуля интернет-магазина minishop2. Для других модулей алгоритм похож, но объекты отличаются.

Задача: сделать автоматический пересчет стоимости товаров в зависимости от общего количества товаров, находящихся в корзине.

$cartArray = $cart->get(); // Массив товаров в корзине
$cartProduct = $cartArray[$key]; // Один товар в корзине

Решение: пройти по всему массиву корзины и изменить цену товаров.

Простой проход по всем товарам:

$cartArray = $cart->get(); // Массив товаров в корзине
foreach($cartArray as $cartProduct) { // Запускаем цикл прохода по всем товарам в корзине
    $price = $cartProduct['price']; // Один элемент корзины
}

Следующий важный момент: изменять необходимо оригинальную цену, а не ту, которая в корзине. Пример: один раз изменили цену при достижении 5 шт., пользователь погулял по сайту, в корзине стало 20 шт. — если при втором изменении мы возьмем за основу цену, которая записана в корзине, скидка получится больше положенной.

Есть 2 варианта решения:

  1. В options товара в корзине записывать оригинальную цену при добавлении
  2. Каждый раз получать оригинальную цену из объекта товара
Второй вариант рациональнее.

Готовый плагин:

switch ($modx->event->name) {
    case 'msOnAddToCart': case 'msOnChangeInCart': // Обрабатывать только события добавления в корзину и изменения количества
 
        $cartArray = $cart->get(); // Массив корзины
        $cartStatus = $cart->status(); // Состояние корзины
        $totalCount = $cartStatus['total_count']; // Общее количество товаров в корзине
 
        if ($totalCount < 5) $coeff = 1; // Установка коэффициента в зависимости от количества 
        elseif ($totalCount < 10) $coeff = 0.8;
        elseif ($totalCount < 20) $coeff = 0.7;
        else $coeff = 0.6;
 
        foreach ($cartArray as &$cartProduct) { // Обрабатываем все товары корзины
            if ($product = $modx->getObject('msProduct', $cartProduct['id'])) { // Получаем объект товара по его ID в корзине
                $cartProduct['price'] = $product->get('price') * $coeff; // Изменение цены
            }
        }
 
        $cart->set($cartArray); // Запись нового состояния корзины
        break;
 
}
Воеводский Михаил
27 марта 2016, 21:14
modx.pro
32
4 836
+13

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

Здоров Александр
28 марта 2016, 07:13
0
Огромное спасибо, как раз поступил заказ на интернет магазин именно с таким условием — скидка от количества!
как я могу вас поблагодарить материально?
    Воеводский Михаил
    28 марта 2016, 13:34
    +3
    Если столь велико желание — напишите на почту.
    В остальном — на здоровье. Не только копируйте, но изучайте и совершенствуйте раскиданные на просторах сети готовые решения.
    Воеводский Михаил
    15 апреля 2016, 11:42
    0
    В код закралась маленькая ошибка.
    Поскольку цена хранится в связанном объекте, в свойстве
    $product->price
    ее нет. Цену необходимо получать так:
    $product->get('price');
    Плагин в посте обновлен.
      Юрий
      23 августа 2021, 12:15
      0
      Здраствуйте… отличный плагин спасибо
      Не подскажете как на лету меня цену товара обратно…
      ситуация добавили 3 товара, потом изменили количество
      и на против товара цена назад не изменилась на лету… общая сума изменилась
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4