Комплект со скидкой вместо нескольких товаров в корзине modx minishop2

Иногда бывает так, что нужно провести акцию, что при покупке двух и более разных товаров их общая стоимость будет акционной. Это можно реализовать через отдельный комплектный товар. Ниже описано как это сделать.

Вам нужно создать плагин и повесить его на событие msOnAddToCart и написать в нем следующий код:

<?php
switch ($modx->event->name) {
    case 'msOnAddToCart':
        $cartArray = $cart->get();

        //id комплектного товара
        $idKomplekt = 11;

        // id товаров, которые входят в комплект. Если все эти товары есть в корзине, то они будут кратно уменьшены и добавлен товар-комплект.
        $productsToKomplekt = [
            7,
            8,
        ];

        $komplektProductsKeys = [];

        foreach ($cartArray as $k => $cartProduct) {
            if (in_array($cartProduct['id'], $productsToKomplekt)) {
                $komplektProductsKeys[] = $k;
            }

            if (count($productsToKomplekt) == count($komplektProductsKeys)) {
                break;
            }
        }

        if (count($productsToKomplekt) == count($komplektProductsKeys)) {
            $min_count = 9999;

            foreach ($komplektProductsKeys as $k) {
                if ($cartArray[$k]['count'] < $min_count) {
                    $min_count = $cartArray[$k]['count'];
                }

                if ($min_count == 1) {
                    break;
                }
            }

            foreach ($komplektProductsKeys as $k) {
                if ($cartArray[$k]['count'] > $min_count) {
                    $cartArray[$k]['count'] = $cartArray[$k]['count'] - $min_count;
                } else {
                    unset($cartArray[$k]);
                }
            }

            $cart->set($cartArray);
            $cart->add($idKomplekt, $min_count);
        }
        break;
}