Иногда случается так, что каталог товаров уже заполнен, но у каждого товара выбрана только одна категория нижнего уровня. А хотелось бы, чтобы товар отображался во всех категориях, которые являются родителем. Это можно сделать с помощью одного запроса к mysqlЧтобы внести ясность - приведу пример.У нас есть товар "Пылесос ПС-01".Есть иерархия категорий:Бытовая техникаТехника для домаПылесосыСейчас наш товар отображается только в категории "Пылесосы". А нам надо, чтобы он отображался в категориях "Пылесосы", "Техника для дома" и "Бытовая техника".И таких товаров у нас очень много и много различных категорий со своей иерархией.Руками добавить 10 000 товаров во все родительские категории - дело для выносливых, усидчивых, старательных.Мы же выполним mySQL запрос:MySQL INSERT INTO oc_product_to_category ( SELECT p.product_id, c2.category_id FROM oc_product p INNER JOIN oc_product_to_category ptc ON (p.product_id = ptc.product_id) LEFT JOIN oc_category_path cp ON (ptc.category_id = cp.category_id) LEFT JOIN oc_category c1 ON (cp.category_id = c1.category_id) LEFT JOIN oc_category c2 ON (cp.path_id = c2.category_id) WHERE c1.category_id != c2.category_id);123456789INSERT INTO oc_product_to_category ( SELECT p.product_id, c2.category_id FROM oc_product p INNER JOIN oc_product_to_category ptc ON (p.product_id = ptc.product_id) LEFT JOIN oc_category_path cp ON (ptc.category_id = cp.category_id) LEFT JOIN oc_category c1 ON (cp.category_id = c1.category_id) LEFT JOIN oc_category c2 ON (cp.path_id = c2.category_id) WHERE c1.category_id != c2.category_id);Не забудьте поменять префикс oc_ на тот, который используется в вашей базе.Готово.!!!Не забывайте делать бэкап перед прямыми запросами в базу
Alex 15.05.2018 в 21:43Подскажите, как организовать сортировку товаров в категории верхнего уровня, чтобы в ней сначала отображались товары из первой категории, затем второй и тп. Ответить ↓
Администратор Автор сообщения 16.05.2018 в 11:31Нужно править файл "\catalog\model\catalog\product.php" Функцию getProducts()Перед строкой (62): if (!empty($data['filter_category_id'])) { Добавить строку: $sql .= ", (SELECT min(level) FROM oc_category_path WHERE path_id = p2c.category_id) as level"Строку (177): $sql .= " ORDER BY p.sort_order"; Привести к следующему виду: $sql .= " ORDER BY level, p.sort_order"; Ответить ↓