Не работает пересчет цен в корзине

В зависимости от общего количества товара в корзине плагин устанавливает скидку на каждый товар: от 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, пересчитывать цены у каждого товара в корзине автоматом.
Артем
11 октября 2015, 07:03
modx.pro
5
2 287
+1

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

Артем Носов
11 октября 2015, 11:36
0
а почему бы не сделать проще и высчитывать процент скидки от total_count?
    Артем
    11 октября 2015, 11:40
    0
    Нет, это не подходит, нужно рассчитывать скидку именно для каждого товара. У меня просто довольно сложный алгоритм расчета оптовых цен, но я не стал его весь приводить и упростил плагин до скидки от общего кол-ва, так как смысл тот же.
    Воеводский Михаил
    12 октября 2015, 03:32
    +1
    foreach ($tmp as $cartProduct) {} тебе поможет. Если необходимо подробнее, скажи — напишу завтра с ПК.
      Артем
      12 октября 2015, 05:33
      0
      да, буду благодарен, если объясните
        Воеводский Михаил
        12 октября 2015, 17:16
        1
        +2
        $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;
        
        }
          Артем
          12 октября 2015, 17:37
          0
          Спасибо, большое, все получилось!
      Николай
      12 июля 2016, 10:33
      0
      Здравствуйте. Прошу ссылку или подсказку.

      На сайте всего один товар, меняю его цену в админке — и в корзине появляется дубль товара.

      А как исправить ситуацию? Чтобы без дублей.

      А то человек прийдет второй раз на сайт — а там корзина битая, два товара одинаковых и цена разная.
        Воеводский Михаил
        12 июля 2016, 11:18
        0
        Переопределить класс заказа и изменить в нем принцип формирования хэша для товара в корзине. Сейчас здесь задействована цена, потому и ее изменении хэш становится иным. Следовательно, в корзину товар попадает как отдельная сущность.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8