ВАЖНО: описан алгоритм для модуля интернет-магазина minishop2. Для других модулей алгоритм похож, но объекты отличаются.

Задача: сделать автоматический пересчет стоимости товаров в зависимости от общего количества товаров, находящихся в корзине.

$cartArray = $cart->get(); // Массив товаров в корзине
$cartProduct = $cartArray[$key]; // Один товар в корзине

Решение: пройти по всему массиву корзины и изменить цену товаров.

Простой проход по всем товарам:

$cartArray = $cart->get(); // Массив товаров в корзине
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'])) { // Получаем объект товара по его ID в корзине
                $cartProduct['price'] = $product->price * $coeff; // Изменение цены
            }
        }
 
        $cart->set($cartArray); // Запись нового состояния корзины
        break;
 
}