Ручное создание секций инфоблоков – дело несложное, но очень утомительное. И с учетом не сильно расторопной админки может затянуться на длительное время. Сегодня я хочу поделиться скриптом, который автоматизирует этот процесс.
На скриншоте ниже представлен вид страницы со скриптом.
Выпадающий список содержит все инфоблоки системы в виде Тип инфоблока – Название инфоблока, среди которых нужно выбрать необходимый для заполнения.
Текстовое поле предназначено для ввода названий секций. Одна строка – одна секция. Вложенность реализуется с помощью символов «-» перед названиями. Например, строки
Колбаса -Докторская --Свежая --Просроченная -Любительская Сыр
соответствуют разделам 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