Подправить скрипт для main category

Тема в разделе "Общие вопросы", создана пользователем luckyshot, 15 авг 2023.

  1. luckyshot

    luckyshot Новичок

    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте, есть скрипт который проставляет главную категорию всем товарам.
    Подскажите что нужно поменять чтобы он подставлял главную категорию самого первого уровня.
    К примеру сейчас он работает вот так:
    Товару из категории (Мужская обувь --- сандали летние) он подставляет главную категорию - "сандали летние". А нужно чтобы при любом уровне вложенности главная категория всегда была Мужская обувь



    <?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'];
    }
     
  2. Tom

    Tom Специалист

    Сообщения:
    514
    Симпатии:
    161
    Что если так ?
    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_HOSTNAMEDB_USERNAMEDB_PASSWORDDB_DATABASEDB_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 
    "Скрипт успешно завершил свою работу!";
    ?>
     
    Последнее редактирование: 17 авг 2023
    karpov нравится это.