Задача: сделать автоматический пересчет стоимости товаров в зависимости от общего количества товаров, находящихся в корзине.
$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->price * $coeff; // Изменение цены
}
}
$cart->set($cartArray); // Запись нового состояния корзины
break;
}
Pavel Bozhok 31.03.2016 10:47 #
Сергей 20.08.2019 12:55 #
Я новичок. Просто создал плагин с вашим кодом, и всё…
Может что-то ещё надо делать?) Как-то его куда-то встраивать?..
Денис 11.03.2021 15:43 #