Здравствуйте, есть скрипт который проставляет главную категорию всем товарам. Подскажите что нужно поменять чтобы он подставлял главную категорию самого первого уровня. К примеру сейчас он работает вот так: Товару из категории (Мужская обувь --- сандали летние) он подставляет главную категорию - "сандали летние". А нужно чтобы при любом уровне вложенности главная категория всегда была Мужская обувь <?php require_once 'config.php'; require_once DIR_SYSTEM . 'library/db/' . DB_DRIVER . '.php'; $db = new \DB\MySQLi(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT); $sql = "SELECT DISTINCT p2c.product_id" . " FROM " . DB_PREFIX . "product_to_category as p2c" . " WHERE p2c.product_id NOT IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE main_category = '1')"; //echo $sql; $query = $db->query($sql); if ($query->num_rows > 0) { foreach ($query->rows as $row) { $main_category_id = solveMainCategory($row['product_id']); echo $row['product_id'] . " -- $main_category_id<br>"; $sql = "UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE product_id = '" . (int)$row['product_id'] . "' AND category_id = '" . (int)$main_category_id . "'"; $query = $db->query($sql); } } function solveMainCategory($product_id) { global $db; $result_category_id = 0; $sql = "SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"; $query = $db->query($sql); if (1 == $query->num_rows) { $result_category_id = $query->row['category_id']; } if ($query->num_rows > 1) { // Определяем главную категорию товара по уровню вложенности // Но! // Товар может принадлежать двум подкатегориями с одинаковым уровнем вложенности, // которые при это имеют совершенно разные родительские категории!! $array = []; foreach ($query->rows as $row) { $level = getPath($row['category_id']); $array[$row['category_id']] = $level; } $max_level = max($array); foreach ($array as $category_id => $level) { if ($level < $max_level) { unset($array[$category_id]); } } $result_category_id = max(array_keys($array)); } return $result_category_id; } function getPath($category_id) { global $db; $sql = "SELECT level FROM " . DB_PREFIX . "category_path WHERE category_id = '" . (int)$category_id . "' AND path_id = '" . (int)$category_id . "'"; $query = $db->query($sql); return $query->row['level']; }
Что если так ? PHP: <?php /* Скрипт обновляет информацию о главных категориях товаров в таблице product_to_category. Он находит товары, которые не имеют главной категории (значение main_category равно 0), и устанавливает главную категорию для них на основе верхней категории товара. Если товар уже имеет главную категорию, то обновление не производится. После завершения работы скрипт выводит сообщение "Скрипт успешно завершил свою работу!". Рекомендую добавить индексы для полей product_id и main_category в таблице oc_product_to_category , если ранее они не добавлялись. Ниже запросы для их добавления. "ALTER TABLE `oc_product_to_category` ADD INDEX(`product_id`);" "ALTER TABLE `oc_product_to_category` ADD INDEX(`main_category`);" ВНИМАНИЕ !!!! ДЕЛАЙТЕ БЭКАП ПЕРЕД ЗАПУСКОМ СКРИПТА! */ require_once 'config.php'; require_once DIR_SYSTEM . 'library/db/' . DB_DRIVER . '.php'; $db = new \DB\MySQLi(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT); $sql = "SELECT DISTINCT product_id FROM " . DB_PREFIX . "product_to_category WHERE main_category = '0'"; $query = $db->query($sql); if ($query->num_rows > 0) { foreach ($query->rows as $row) { $product_id = $row['product_id']; $main_category_id = getTopmostCategory($product_id); if (!empty($main_category_id)) { $existing_main_category = getExistingMainCategory($product_id); if (empty($existing_main_category)) { $sql = "UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE product_id = '" . (int)$product_id . "' AND category_id = '" . (int)$main_category_id . "'"; $query = $db->query($sql); } } } } function getTopmostCategory($product_id) { global $db; $sql = "SELECT DISTINCT path_id FROM " . DB_PREFIX . "category_path WHERE category_id IN (SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "') ORDER BY level ASC"; $query = $db->query($sql); if ($query->num_rows > 0) { return $query->row['path_id']; } return null; } function getExistingMainCategory($product_id) { global $db; $sql = "SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "' AND main_category = '1'"; $query = $db->query($sql); if ($query->num_rows > 0) { return $query->row['category_id']; } return null; } echo "Скрипт успешно завершил свою работу!";?>