0 Пользователей и 1 Гость просматривают эту тему.
  • 8 Ответов
  • 1863 Просмотров
*

max_max

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
Всем привет. Я сделал свой импорт товаров из csv в VM. Все загружается отлично, с учетом изображений. Но остался один нюанс. Вот на пример, у меня есть 5 уровней вложенности категорий:

Товар;Товар гурппа 2;Товар гурппа 3;Товар гурппа 4;Товар гурппа 5;
Товар;Товар гурппа 2;Товар гурппа 3;;;
Товар;;;;;
...
и все в таком духе.

Эти категории я импортирую в таблицу jos_virtuemart_categories_en_gb, внутри цикла for, указав интервал. Не спрашивайте почему не _ru_ru. Это долгая история.

Вот кусок кода:

Код
foreach ($get_csv as $value) {
for ($i = 0; $i <= 4; $i++) {
            if ($value[$i]) {
                mysqli_query($mysqli, "INSERT INTO jos_virtuemart_categories_en_gb (category_name, category_description, slug) VALUES ('" . $value[$i] . "', '<p>Категория " . $value[$i] . "</p>', '" . translit($value[$i]). "') ON DUPLICATE KEY UPDATE category_name = category_name");           
            }
        }
}

И все категории в данную таблицу загружаются как надо и без дублей. Но я не могу понять, как привязать товар к соответствующей категории. Так же, я нашел эту таблицу - jos_virtuemart_product_categories. Скрин этой таблицы во вложении. В этой таблице есть поля с id товара и id категории, и это, как я пониманию и есть привязка товара в категории.

И как это сделать в коде?! Не могу понять. Если поможете советом, буду рад. Спасибо.



*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
jos_virtuemart_product_categories Да - Это таблица связей товаров и категорий !
Но я не могу понять, как привязать товар к соответствующей категории.
Ну а что тут не понятно !
Если товар - лежит только в одной категории - создаете 
      - после создания товара ищите категорию в которой он лежит - получаете ID
      -- Если категории с таким названием нет  - создаете - получаете ID
Тут вот в чем вопрос скорее == как это сохранить  перед импортом ?

У примеру есть товар "Масло Сливочное 250гр."
этот товар должен лежать после импорта в 2х категориях
1 Продуты питания.
2 Замороженные продукты питания

- то соответственно в поле Категория товара у Вас должен быть разделитель категорий
Продуты питания|Замороженные продукты питания

А еще можно придумать сразу индикатор вложенности
типа так:
Продуты питания/Молочная продукция|Замороженные продукты питания

то так --
"|" - индикатор разделения категорий       
"/" - индикатор вложенности 

Не знаю может не понятно объяснил ! ))






*

max_max

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
ну а коде это все explode('|' [] );

Здравствуйте. Спасибо за развернутый ответ. В целом понятна суть вашего ответа. Прост у меня есть конкретный файл для импорта, и там более 5000 товаров, и я не могу его править.
И это CSV. Я просто не могу понять, как мне логику написать, которая будет делать вложенность товаров и категорий в другие категории согласно данным файла импорта. Вот более полный код моего импорта. Это самая главная часть в цикле foreach:

Код
foreach ($get_csv as $value) {
        $index_id++;
        if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_products (product_sku, product_weight, product_weight_uom, product_in_stock, product_unit, product_params) VALUES ('" . $value[6] . "', '" . $value[12] . "', '" . $value[8] . "', '" . $value[9] . "', '" . $value[8] . "', 'min_order_level=null|max_order_level=null|step_order_level=null|product_box=null|') ON DUPLICATE KEY UPDATE product_sku = product_sku")) {
            echo "product_all yes";
        } else {
            var_dump($mysqli->error);
            die;
            echo "product_all no";
        }
       
        if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_products_en_gb (product_desc, product_name, slug) VALUES ('" . $value[11] . "', '" . $value[5] . "', '" . translit($value[5]). "') ON DUPLICATE KEY UPDATE product_name = product_name")) {
            echo "product_name yes";
        } else {
            var_dump($mysqli->error);
            die;
            echo "product_name no";
        }

        for ($i = 0; $i <= 4; $i++) {
            if ($value[$i]) {
                if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_categories_en_gb (category_name, category_description, slug) VALUES ('" . $value[$i] . "', '<p>Категория " . $value[$i] . "</p>', '" . translit($value[$i]). "') ON DUPLICATE KEY UPDATE category_name = category_name")) {
                    echo "category yes";

                   if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_product_categories (virtuemart_product_id, virtuemart_category_id) VALUES ('" . $index_id . "', '" . $i . "') ON DUPLICATE KEY UPDATE virtuemart_product_id = virtuemart_product_id")) {
                        echo "category yes";
                    } else {
                        var_dump($mysqli->error);
                        die;
                        echo "category no";
                    }

                } else {
                    var_dump($mysqli->error);
                    die;
                    echo "category no";
                }
            }
        }


        if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_categories (ordering) VALUES ('" . 1 . "') ON DUPLICATE KEY UPDATE virtuemart_category_id = virtuemart_category_id")) {
            echo "category yes";
        } else {
            var_dump($mysqli->error);
            die;
            echo "category no";
        }



        if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_product_prices (virtuemart_product_id, product_price) VALUES ('" . $index_id . "', '" . $value[7] . "')")) {
            echo "product_prices yes";
        } else {
            var_dump($mysqli->error);
            die;
            echo "product_prices no";
        }

        if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_medias (file_title, file_mimetype, file_type, file_url) VALUES ('" . $value[10] . "', 'image/png', 'product', '" . 'images/stories/virtuemart/product/' . $value[10] . "') ON DUPLICATE KEY UPDATE file_url = file_url")) {
            echo "product_images yes";
        } else {
            var_dump($mysqli->error);
            die;
            echo "product_images no";
        }

        if (mysqli_query($mysqli, "INSERT INTO jos_virtuemart_product_medias (virtuemart_product_id, virtuemart_media_id) VALUES ('" . $index_id . "', '" . $index_id . "') ON DUPLICATE KEY UPDATE virtuemart_media_id = virtuemart_media_id")) {
            echo "product_images_2 yes";
        } else {
            var_dump($mysqli->error);
            die;
            echo "product_images_2 no";
        }
    }



« Последнее редактирование: 17.08.2021, 23:23:03 от max_max »
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Судя по префиксу  jos, Joomla 1.5 ?
В старом ВИрт не поддерживается привязка товара к нескольким категориям.
К одной категории делайте привязку товара, после вставки товара и категории, сделав проверку на наличие товара и категории .
Подкатегории аналогично, может даже в другом цикле .
*

max_max

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
Судя по префиксу  jos, Joomla 1.5 ?
В старом ВИрт не поддерживается привязка товара к нескольким категориям.
К одной категории делайте привязку товара, после вставки товара и категории, сделав проверку на наличие товара и категории .
Подкатегории аналогично, может даже в другом цикле .

Здравствуйте. Спасибо за ответ. Нет, версия Joomla! 3.6.2. А версия VM - VirtueMart 3.0.4.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Судя по префиксу  jos, Joomla 1.5 ?
;D - Да ну не .... Там что то новое - так как по моему как то по другому категории организованы в VM - OLD )

А еще если посмотреть что там абсолютно не используется  $db = JFactory::getDbo(); то можно сказать что и не Joomla в обще ! )))


 
Я просто не могу понять, как мне логику написать, которая будет делать вложенность товаров и категорий в другие категории согласно данным файла импорта.
- Очень интересно ! )
Как ? - Ну как ! - Вы же можете получить из данных импорта товар -> и его категории !
1. Берем категории - Гвозди;Строительные; - кладем в массив ...
Код
/**
     * @var int $newProductId - после создания нового товара получаем ено Id
     */
    $newProductId = 345 ;
    /**
     * Создаем массив из категорий
     */
    $productCatArr = explode(';', 'Гвозди;Строительные;');
    foreach ($productCatArr as $productCat ){
       $category_id = _checkCategory($productCatArr);

       _addProductCategoryMap($category_id ,$newProductId);
    }

    /**
     * privat function - добавляем товару ссылку на категорию ссылку
     *
     * @param $category_id
     * @param $newProductId
     *
     * @since  3.9
     *
     */
    function _addProductCategoryMap($category_id ,$newProductId){
       
        return true ;
    }

    /**
     * privat function Проверка категории если категория есть - возвращаем ID категории
     *
     * @param      $categoryName
     * @param bool $parentId
     *
     * @return int Id новой категории
     * @since  3.9
     */
    function _checkCategory( $categoryName , $parentId = false ){
        $idCat = 178;
        if( $idCat )
        {
            return $idCat ;
        }else{
            #Создание новой категории -
            return  _addNewCategory( $categoryName , $parentId = false )
        }#END IF

    }

    /**
     * privat function Создание новой категории -
     * @param       $categoryName
     * @param false $parentId
     *
     * @return int Id новой (созданной) категории
     * @since  3.9
     *
     */
    function _addNewCategory($categoryName , $parentId = false){
        $newCatId = 299 ;
        return $newCatId ;
    }

Все это к чему - что это на каждый товар  создаст еще 5-6 запросов к DB - и тут серв может психануть !
то надо в начале как то парсить по товарам кидать обратно на клиента - и от клиента грузить Ajax-(сом)
по 10-20 товаров !!
Но  это решаемо тоже !
Успехов !
*

max_max

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
;D - Да ну не .... Там что то новое - так как по моему как то по другому категории организованы в VM - OLD )

А еще если посмотреть что там абсолютно не используется  $db = JFactory::getDbo(); то можно сказать что и не Joomla в обще ! )))


 - Очень интересно ! )
Как ? - Ну как ! - Вы же можете получить из данных импорта товар -> и его категории !
1. Берем категории - Гвозди;Строительные; - кладем в массив ...
Код
/**
     * @var int $newProductId - после создания нового товара получаем ено Id
     */
    $newProductId = 345 ;
    /**
     * Создаем массив из категорий
     */
    $productCatArr = explode(';', 'Гвозди;Строительные;');
    foreach ($productCatArr as $productCat ){
       $category_id = _checkCategory($productCatArr);

       _addProductCategoryMap($category_id ,$newProductId);
    }

    /**
     * privat function - добавляем товару ссылку на категорию ссылку
     *
     * @param $category_id
     * @param $newProductId
     *
     * @since  3.9
     *
     */
    function _addProductCategoryMap($category_id ,$newProductId){
       
        return true ;
    }

    /**
     * privat function Проверка категории если категория есть - возвращаем ID категории
     *
     * @param      $categoryName
     * @param bool $parentId
     *
     * @return int Id новой категории
     * @since  3.9
     */
    function _checkCategory( $categoryName , $parentId = false ){
        $idCat = 178;
        if( $idCat )
        {
            return $idCat ;
        }else{
            #Создание новой категории -
            return  _addNewCategory( $categoryName , $parentId = false )
        }#END IF

    }

    /**
     * privat function Создание новой категории -
     * @param       $categoryName
     * @param false $parentId
     *
     * @return int Id новой (созданной) категории
     * @since  3.9
     *
     */
    function _addNewCategory($categoryName , $parentId = false){
        $newCatId = 299 ;
        return $newCatId ;
    }

Все это к чему - что это на каждый товар  создаст еще 5-6 запросов к DB - и тут серв может психануть !
то надо в начале как то парсить по товарам кидать обратно на клиента - и от клиента грузить Ajax-(сом)
по 10-20 товаров !!
Но  это решаемо тоже !
Успехов !

Спасибо огромное. Попробую.
*

max_max

  • Осваиваюсь на форуме
  • 40
  • 0 / 0
Похоже, то, что нужно, но как с таблицами jos_virtuemart_category_categories и jos_virtuemart_categories?
« Последнее редактирование: 16.08.2021, 21:59:13 от max_max »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Выгрузка товаров в Яндекс.Маркет для VirtueMart 3.x, VirtueMart 4

Автор icom

Ответов: 791
Просмотров: 132954
Последний ответ 03.07.2023, 10:02:04
от strongest
csvi Pro 7.3.0. Игнорирование существующих полей пи импорте товаров

Автор Viktor

Ответов: 2
Просмотров: 1949
Последний ответ 13.12.2019, 22:44:43
от AlexB
CSVI импорт товаров - Ну никак.(РЕШЕНО!)

Автор vtrcmert

Ответов: 129
Просмотров: 48858
Последний ответ 13.09.2019, 16:05:21
от forlan
Выгрузка товаров с VirtueMart в olx?

Автор Stasweb

Ответов: 1
Просмотров: 2209
Последний ответ 03.03.2019, 16:00:47
от gartes
VMXGate Lite - Компонент экспорта товаров в Яндекс Ма

Автор softman_xp

Ответов: 106
Просмотров: 20162
Последний ответ 21.11.2018, 10:29:51
от dron