Вложенный импорт в Minishop2 из CSV

Добрый день!
Интересует вопрос, я бы даже сказал «горит». Уже несколько дней внимательно читал гугл и официальную документацию по импорту в частности, но так и не смог разобраться, как сделать импорт из CSV в minishop2 товаров во вложенных категориях?
Например, «Подушки» >>> «Декоративные» >>> «Синтетические» >>> «Сам товар».
Сталкивался кто-нибудь? И вообще, это реально сделать штатными средствами?
Естественно, импорт в одну категорию, указав «parent», сделать получается.
Спасибо большое!
Андрей Воробьев
28 августа 2015, 11:32
modx.pro
1
3 291
0

Комментарии: 4

Василий Наумкин
28 августа 2015, 14:37
+1
Создать категории, затем загрузить в них товар, указывая верный parent.

Родной импорт не рассчитан на импорт категорий, потому что он работает с csv, в котором нет вложенности.
    Андрей Воробьев
    28 августа 2015, 14:40
    0
    Спасибо!
    В нашем CSV вложенность указана через колонки, типа «group1», «group2» и т.п., указывающая на уровень от первого. Если допилим такой импорт, обязательно выложу, людям наверняка пригодится.
    Андрей Воробьев
    11 сентября 2015, 12:37
    1
    +1
    Написал четырехуровневый импорт из CSV (на быстроту/качественность кода не претендую, замечания приветствуются).
    Товаров у меня 75000, обработка в районе 4-х часов идет.
    Работает пока что только с включенной автоматической транслитерацией.

    Код ниже вставляется от строки // Import до строки // Set default values
    При этом задавать «parent» при отправке запроса на импорт не нужно, он указывается в скрипте.

    Первые три колонки, как я и писал, указывают на НАИМЕНОВАНИЯ родительских категорий товаров (указывать id не нужно):
    группа1; группа2; группа3 (например, Подушки; Декоративные; Синтетические)

    Скан происходит в заранее созданной категории с id, указанным в $parent_id (0 — корень);
    Создавать категории заранее не нужно. Скрипт проверяет на наличие категории по алиасу и, если категории с таким алиасом не существует, он ее создает.
    Если вложенные группа2 или 3 не указываются, то выгружается товар в его родителя (в т.ч. и в корень).

    // Import!
    $parent_id = 0; // Указываем здесь id корневого каталога, куда выгружать 
    $handle = fopen($file, "r");
    $rows = $created = $updated = 0;
    while (($csv = fgetcsv($handle, 0, $delimeter)) !== false) {
    	$rows ++;
    	$data = $gallery = array();
    	$modx->error->reset();
    	$modx->log(modX::LOG_LEVEL_INFO, "Raw data for import: \n".print_r($csv,1));
    	foreach ($keys as $k => $v) {
    		if (!isset($csv[$k])) {
    			exit('Field "' . $v . '" not exists in file. Please fix import file or parameter "fields".');
    		}
    		if ($v == 'g1') { ///Если поле g1, вычисляем id по транслиту имени каталога
    		    if ($csv[$k]=='') {$data['parent']=381;} else {
    		    $pdo = $modx->getService('pdoFetch');
                $newcat = $pdo->getObject('modResource', array('pagetitle' => $csv[$k]));
                if (!$newcat) { ///Если такой id не существует, то создаем его
                    $parent = $modx->newObject('modResource');
                    $parent->set('pagetitle',$csv[$k]);
                    $parent->set('alias',$csv[$k]);
                    $parent->set('parent',31);
                    $parent->set('template',2);
                    $parent->set('class_key','msCategory');
                    $parent->set('published','1');
                    $parent->set('hidemenu','0');
                    $parent->save();
                }
    		    $data['parent'] = $newcat['id'];
    		    }
    		}
    		if ($v == 'g2') { ///Если поле g2, вычисляем id по транслиту имени каталога
    		    if ($csv[$k]!=='') {
    		    $pdo = $modx->getService('pdoFetch');
                $newcat = $pdo->getObject('modResource', array('pagetitle' => $csv[$k]));
                if (!$newcat) { ///Если такой id не существует, то создаем его
                    $par = $pdo->getObject('modResource', array('pagetitle' => $data['g1']));
                    $parent = $modx->newObject('modResource');
                    $parent->set('pagetitle',$csv[$k]);
                    $parent->set('alias',$csv[$k]);
                    $parent->set('parent',$par['id']);
                    $parent->set('template',2);
                    $parent->set('class_key','msCategory');
                    $parent->set('published','1');
                    $parent->set('hidemenu','0');
                    $parent->save();
                }
    		    $data['parent'] = $newcat['id'];
    		    }
    		}
    		if ($v == 'g3') { ///Если поле g3, вычисляем id по транслиту имени каталога
    		    if ($csv[$k]!=='') {
    		    $pdo = $modx->getService('pdoFetch');
                $newcat = $pdo->getObject('modResource', array('pagetitle' => $csv[$k]));
                if (!$newcat) { ///Если такой id не существует, то создаем его
                    $par = $pdo->getObject('modResource', array('pagetitle' => $data['g2']));
                    $parent = $modx->newObject('modResource');
                    $parent->set('pagetitle',$csv[$k]);
                    $parent->set('alias',$csv[$k]);
                    $parent->set('parent',$par['id']);
                    $parent->set('template',2);
                    $parent->set('class_key','msCategory');
                    $parent->set('published','1');
                    $parent->set('hidemenu','0');
                    $parent->save();
                }
    		    $data['parent'] = $newcat['id'];
    	    	}
    		}
    		if ($v == 'gallery') {
    			$gallery[] = $csv[$k];
    		}
    		elseif (isset($data[$v]) && !is_array($data[$v])) {
    			$data[$v] = array($data[$v], $csv[$k]);
    		}
    		elseif (isset($data[$v]) && is_array($data[$v])) {
    			$data[$v][] = $csv[$k];
    		}
    		else {
    			$data[$v] = $csv[$k];
    		}
    	}
    	$is_product = false;
      Андрей Воробьев
      11 сентября 2015, 13:00
      0
      Черт, в коде облажался, вместо $data['parent']=381 нужно поставить $data['parent']=$parent_id

      И добавить забыл, родительские категории указываются как group1, group2 и group3

      Администрация, исправьте, пожалуйста!
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4