Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Перенос структуры каталогов

00 голосов
3
Добрый день!

Хочу перенести каталог из одной цмс в Битрикс, посоветуйте как лучше это технически реализовать.
Я поступаю следующим образом:

Через административный в битриксе я создаю инфоблок с нужными мне свойствами. Затем мне нужно добавить подразделы. Поскольку подразделов много и вручную их добавлять желания нету - то имеет смысл использовать API.

Структура базы данных в моей цмс следующая:

Таблица: Грузовики
Таблица: Автобусы
Таблица: Легковые автомобили
...

ТАБЛИЦА ГРУЗОВИКИ:
id, name, parent_id, is_folder

1 МАЗ 0 1
2 КРАЗ 0 1
3 УАЗ 0 1
4 Автомобиль МАЗ-346-201 1 0
5 Автомобиль МАЗ-346-202 1 0
6 Автомобиль МАЗ-346-202 1 0
7 Автомобиль КРАЗ-347-102 2 0
8 Автомобиль КРАЗ-348-103 11 0
9 Автомобиль КРАЗ-349-104 11 0
10 Самосвалы 3 1
11 Тягачи 3 1
12 Прицепы 3 1
13... и тд.


Я пишу скрипт переноса:
Первым делом я хочу сделать структуру каталогов инфоблока, такую же как в моей базе.

Делаю выборку из таблицы "Грузовики":

Цитата


$rez = mysql_query ("SELECT * FROM camions WHERE is_folder=1");
$bs = new CIBlockSection; // Обьект категории

while ( list($id, $name, $parent_id) = mysql_fetch_array($rez) )
{

$arFields = Array(
"ID" => $id,
"ACTIVE" => "Y",
"IBLOCK_SECTION_ID" => $parent_id, // ID группы родителя, если не задан то группа корневая.
"IBLOCK_ID" => "4", //ID информационного блока (грузовики)
"NAME" => $name
);

echo "Элемент ".$parent_id."добавлен <br>";

$bs->Add($arFields);
}


Но к сожалению так добавляются только корневые категории (у которых parent_id =0), а подкатегории не добавляются.
АПИ функция битрикса игнорирует то что я задаю явно ID категории, и присваивает всем категориям сови ID, в порядке возростания.

Как же тогда правильно перенести структуру каталогов?

Спасибо.
спросил 22 Фев, 14 от Lite (140 баллов)

3 Ответы

00 голосов
Цитата
Иван Левый пишет:
АПИ функция битрикса игнорирует то что я задаю явно ID категории

дык поле ID в таблице b_iblock_section автоинкрементно, конечно будет игнорировать smile:)

Как вариант можно завести массив соответсвий кодов из старой базы с кодами БУСа.
Метод Add() же возвращает $ID свежесозданного раздела.
Код
$ID = $bs->Add($arFields);

Ну и, надеюсь, понятно, что первыми должны быть добавлены родительские разделы (по всему дереву).

А еще можно из старой базы сначала экспортировать в CSV и потом уже станадртными средствами БУСа сделать импорт, что на мой взгляд проще выйдет.
ответил 23 Июль, 14 от Delp (7,220 баллов)
00 голосов
Код
rez = mysql_query ("SELECT * FROM camions WHERE is_folder=1");
$bs = new CIBlockSection; // Обьект категории

$arMap = array();
while ( list($id, $name, $parent_id) = mysql_fetch_array($rez) )
{
if($parent_id)
  $parent_id = $arMap[$parent_id];
$arFields = Array(
"XML_ID" => $id, // XML_ID !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
"ACTIVE" => "Y",
"IBLOCK_SECTION_ID" => $parent_id, // ID группы родителя, если не задан то группа корневая.
"IBLOCK_ID" => "4", //ID информационного блока (грузовики)
"NAME" => $name
);

$arMap[$id] = $bs->Add($arFields);

echo "Элемент ".$id."добавлен <br>";

}
ответил 24 Ноя, 14 от Miso (740 баллов)
00 голосов
Хороший вариант, только у CIBlockSection нету свойства XML_ID, а есть EXTERNAL_ID, который, наверное, можно использовать для этих целей.

И наверное не
Код
if($parent_id)
  $parent_id = $arMap[$parent_id]; 

а
Код
if($parent_id)
  $arMap[$parent_id] = $parent_id; 
ответил 20 Март, 15 от Lite (140 баллов)

Похожие вопросы

0 голосов
1 ответ
0 голосов
4 ответов
0 голосов
3 ответов
0 голосов
5 ответов
спросил 02 Ноя, 13 от Daeno (520 баллов)
0 голосов
2 ответов
спросил 29 Сен, 13 от zDANCERz (120 баллов)