Ручное создание секций инфоблоков – дело несложное, но очень утомительное. И с учетом не сильно расторопной админки может затянуться на длительное время. Сегодня я хочу поделиться скриптом, который автоматизирует этот процесс.
На скриншоте ниже представлен вид страницы со скриптом.

Выпадающий список содержит все инфоблоки системы в виде Тип инфоблока – Название инфоблока, среди которых нужно выбрать необходимый для заполнения.
Текстовое поле предназначено для ввода названий секций. Одна строка – одна секция. Вложенность реализуется с помощью символов «-» перед названиями. Например, строки
Колбаса -Докторская --Свежая --Просроченная -Любительская Сыр
соответствуют разделам 1го уровня «Сыр» и «Колбаса», в «Колбасу» вложены «Докторская» и «Любительская», в «Докторской» есть разделы «Свежая» и «Просроченная».
Код скрипта:
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetPageProperty("NOT_SHOW_NAV_CHAIN", "Y");
$APPLICATION->SetTitle("Импорт секций инфоблока");
?>
<?
if(CModule::IncludeModule("iblock")):
$arIBlocks = Array();
$rsIBlocks = CIBlock::GetList(array("sort"=>"asc"), array("ACTIVE"=>"Y"));
while($arIBlock = $rsIBlocks->Fetch())
{
$arIBlocks[] = Array("ID"=>$arIBlock["ID"], "NAME"=>$arIBlock["NAME"], "IBLOCK_TYPE"=>$arIBlock["IBLOCK_TYPE_ID"]);
}
endif;
?>
<?
if(strlen($_POST["list"])>0)
$arStr = split("\n",$_POST["list"]);
$IBlockID = intval($_POST["iblock"]);
$lastLevel = 1000;
$arLevels = Array();
$errorTrigger = false;
if(count($arStr)>0 && $IBlockID>0):
$arStr[0] = TrimEx(trim($arStr[0]),"-","left"); // первый элемент должен быть на 0м уровне
$bs = new CIBlockSection;
$arFields = Array(
"ACTIVE" => "Y",
"IBLOCK_ID" => $IBlockID,
);
foreach($arStr as $strItem):
$level = 0; // текущий уровень вложености
$strItem = trim($strItem);
while (substr($strItem,0,1)=='-'): // определяем уровень по числу "-", заодно удаляем их
$level++;
$strItem = substr($strItem,1);
endwhile;
$arFields["NAME"] = $strItem; // имя в массив
if($level==0): // уровень вложенности 0 - нет родительской секции
$lastLevel = 0;
elseif($level>$lastLevel): // текущей уровень больше прошлого, идем вглубь структуры
if($arLevels[$lastLevel]) // если есть корректный предок, то заносим в поля. Иначе - будет в корне
$arFields["IBLOCK_SECTION_ID"] = $arLevels[$lastLevel];
$lastLevel = $lastLevel+1;
else:
if($arLevels[$level-1])
$arFields["IBLOCK_SECTION_ID"] = $arLevels[$level-1];
$lastLevel = $level;
endif;
$lastID = $bs->Add($arFields,false);
unset($arFields["IBLOCK_SECTION_ID"]);
if ($lastID>0):
$arLevels[$lastLevel] = $lastID;
else:
unset($arLevels[$lastLevel]);
echo '<span style="color:#ff0000">'.$strItem.'</span><br />';
$errorTrigger = true;
endif;
endforeach;
CIBlockSection::ReSort($IBlockID); // второй параметр функции Add =false, поэтому необходимо сделать ReSort
if(!$errorTrigger) echo '<span style="color:#009900">Секции успешно созданы</span><br /><br />';
endif;
?>
<form action="section_import.php" method="post">
<select name="iblock" style="width:300px;">
<?foreach($arIBlocks as $arItem):?>
<option value="<?=$arItem["ID"]?>"<?if(intval($_POST["iblock"])==$arItem["ID"]) echo 'selected="selected"';?>><?=$arItem["IBLOCK_TYPE"]?> - <?=$arItem["NAME"]?></option>
<?endforeach?>
</select><br />
<textarea name="list" style="width:300px; height:150px;"><?if($_POST["list"]) echo $_POST["list"];?></textarea><br />
<input type="submit" value="Создать разделы" />
</form>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Пожелания по доработке и найденные ошибки пишите в комментариях.
Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!
Подписаться в telegram
Руки еще не дошли до bitrix, вчитаюсь в ближайшее время повнимательней в ваши посты)
Скрипт очень нужный.
А не могли бы Вы данный скрипт адаптировать под последнюю версию Битрикса?
Спасибо!
Получилось Вашим скриптом загрузить разделы. Только нужно убирать в настройках инфоблока галочку обязательной генерации символьного кода.
И символы для разделов нужно делать так:
1. Без тире первый уровень.
2. — одно тире второй уровень.
3. — два тире третий уровень.
Остался только вопрос с символьным кодом. А так, скрипт сэкономил кучу времени, спасибо!
Я добавил создание символьного кода
https://gist.github.com/helloris25/835eda7d941fed85a961