Не работает пересчет цен в корзине
        В зависимости от общего количества товара в корзине плагин устанавливает скидку на каждый товар: от 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;
}            
                Спасибо, большое, все получилось!            
                    
                Здравствуйте. Прошу ссылку или подсказку. 
На сайте всего один товар, меняю его цену в админке — и в корзине появляется дубль товара.
А как исправить ситуацию? Чтобы без дублей.
А то человек прийдет второй раз на сайт — а там корзина битая, два товара одинаковых и цена разная.
                    На сайте всего один товар, меняю его цену в админке — и в корзине появляется дубль товара.
А как исправить ситуацию? Чтобы без дублей.
А то человек прийдет второй раз на сайт — а там корзина битая, два товара одинаковых и цена разная.
                Переопределить класс заказа и изменить в нем принцип формирования хэша для товара в корзине. Сейчас здесь задействована цена, потому и ее изменении хэш становится иным. Следовательно, в корзину товар попадает как отдельная сущность.            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.