Разные скидки в зависимости от количества товаров
Описан алгоритм для модуля интернет-магазина minishop2. Для других модулей алгоритм похож, но объекты отличаются.
Задача: сделать автоматический пересчет стоимости товаров в зависимости от общего количества товаров, находящихся в корзине.
Решение: пройти по всему массиву корзины и изменить цену товаров.
Простой проход по всем товарам:
Следующий важный момент: изменять необходимо оригинальную цену, а не ту, которая в корзине. Пример: один раз изменили цену при достижении 5 шт., пользователь погулял по сайту, в корзине стало 20 шт. — если при втором изменении мы возьмем за основу цену, которая записана в корзине, скидка получится больше положенной.
Есть 2 варианта решения:
Готовый плагин:
Задача: сделать автоматический пересчет стоимости товаров в зависимости от общего количества товаров, находящихся в корзине.
$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;
}
Комментарии: 4
Огромное спасибо, как раз поступил заказ на интернет магазин именно с таким условием — скидка от количества!
как я могу вас поблагодарить материально?
как я могу вас поблагодарить материально?
Если столь велико желание — напишите на почту.
В остальном — на здоровье. Не только копируйте, но изучайте и совершенствуйте раскиданные на просторах сети готовые решения.
В остальном — на здоровье. Не только копируйте, но изучайте и совершенствуйте раскиданные на просторах сети готовые решения.
В код закралась маленькая ошибка.
Поскольку цена хранится в связанном объекте, в свойстве
Поскольку цена хранится в связанном объекте, в свойстве
$product->price
ее нет. Цену необходимо получать так:$product->get('price');
Плагин в посте обновлен.
Здраствуйте… отличный плагин спасибо
Не подскажете как на лету меня цену товара обратно…
ситуация добавили 3 товара, потом изменили количество
и на против товара цена назад не изменилась на лету… общая сума изменилась
Не подскажете как на лету меня цену товара обратно…
ситуация добавили 3 товара, потом изменили количество
и на против товара цена назад не изменилась на лету… общая сума изменилась
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.