Всё просто. Раз корзина у нас находится по адресу /index.php?route=checkout/cart
То вероятнее всего за её генерацию(хз как назвать) отвечает файл контроллера cart.php, находящийся в папке checkout
Что ж, идём его искать. Нашли по ожидаемому адресу \catalog\controller\checkout\cart.php
Ищем в нём строку
$products = $this->cart->getProducts();
и обращаем на неё внимание :) Именно тут вызывается функция из модели, которая достаёт параметры/характеристики/цены/etc для товаров находящихся в корзине.
А дальше всё вообще просто. Следом у нас идёт цикл, перебирающий и проверяющий все товары из корзины. Именно в него и нужно встроить проверку на совпадение родительских категорий. Каким образом вы их сгруппируете - дело ваше.
Только у товаров тут категории сейчас не указаны. Вернёмся к функции getProducts(). Она находится в файле \system\library\cart.php
Находим
$product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");
И заменяем на
$product_query = $this->db->query("SELECT *, cd.name as category_name FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_category ptc ON (ptc.product_id=p.product_id) LEFT JOIN " . DB_PREFIX . "category_description cd ON (cd.category_id=ptc.category_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");
тут прошу простить, если допустил ошибку. ночь всё-таки ;)
Далее опускаемся ниже в файле и находим в конце нашей функции getProducts() эту строку.
$this->data[$key] = array(
Сюда теперь нужно просто вставить нечто вроде
'category_name' => $product_query->row['category_name'],
(при желании можно вытаскивать и id категории. возможно по нему сравнивать дальше будет правильнее)
И его смело можно будет использовать как $product['category_name'] для сравнения в цикле, который я упоминал в самом начале
Надеюсь ошибок не допустил и написал внятно.
Если нужны комментарии к коду, то могу написать
Забыл добавить.
Важно!
Один и тотже товар может в магазине находиться в нескольких категориях.
В этом случае вся ваша затея вообще не имеет смысла. Не будете же вы его дважды в корзине показывать? ;)
Поэтому весь код написан с расчётом на то, что каждый товар относится только к одной категории.