Не работает пересчет цен в корзине
В зависимости от общего количества товара в корзине плагин устанавливает скидку на каждый товар: от 1 до 5 — 0%, от 5 до 10 — 0%, от 10 и выше — 20%.
Код плагина:
Код плагина:
switch ($modx->event->name) {
case 'msOnAddToCart': case 'msOnChangeInCart':
$tmp = $cart->get();
$price= $tmp[$key]['price'];
$tmpm = $cart->status();
$total_count = $tmpm['total_count'];
if ($total_count >= 10) {
$price=$price*0.8;
} elseif ($total_count >= 5) {
$price=$price*0.9;
} else {
$price=$price;
}
$tmp[$key]['price']=$price;
$cart->set($tmp);
break;
}
Беда в том, что цена пересчитывается не у всех товаров в корзине, а только у последнего добавленного/измененного, а для того что бы у остальных она поменялась, надо у каждого оставшегося изменить кол-во. Никак не могу понять, как после увеличения/уменьшения total_count, пересчитывать цены у каждого товара в корзине автоматом. Комментарии: 8
а почему бы не сделать проще и высчитывать процент скидки от total_count?
Нет, это не подходит, нужно рассчитывать скидку именно для каждого товара. У меня просто довольно сложный алгоритм расчета оптовых цен, но я не стал его весь приводить и упростил плагин до скидки от общего кол-ва, так как смысл тот же.
foreach ($tmp as $cartProduct) {} тебе поможет. Если необходимо подробнее, скажи — напишу завтра с ПК.
да, буду благодарен, если объясните
$cartArray = $cart->get(); // Массик товаров в корзине
$cartProduct = $cartArray[$key]; // Один товар в корзине
Ты получаешь сначала весь массив корзины, затем обращаешься только к одному ее элементу, который определен ключом $key — тот элемент, с которым производится действие (добавление, изменение) в данный момент. Но задача — обработать все элементы. Соответственно, необходимо пройти по всему массиву и обработать его: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'])) {
$cartProduct['price'] = $product->price * $coeff;
}
}
$cart->set($cartArray);
break;
}
Спасибо, большое, все получилось!
Здравствуйте. Прошу ссылку или подсказку.
На сайте всего один товар, меняю его цену в админке — и в корзине появляется дубль товара.
А как исправить ситуацию? Чтобы без дублей.
А то человек прийдет второй раз на сайт — а там корзина битая, два товара одинаковых и цена разная.
На сайте всего один товар, меняю его цену в админке — и в корзине появляется дубль товара.
А как исправить ситуацию? Чтобы без дублей.
А то человек прийдет второй раз на сайт — а там корзина битая, два товара одинаковых и цена разная.
Переопределить класс заказа и изменить в нем принцип формирования хэша для товара в корзине. Сейчас здесь задействована цена, потому и ее изменении хэш становится иным. Следовательно, в корзину товар попадает как отдельная сущность.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.