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

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

 

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

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

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

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

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

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

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

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

Второй вариант рациональнее.

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

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;

}
Дата публикации: 2015-10-12 17:30:00
G+

Закрыть

Вернуться

Вернуться

Обратный звонок