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

На скриншоте ниже представлен вид страницы со скриптом.

Выпадающий список содержит все инфоблоки системы в виде Тип инфоблока – Название инфоблока, среди которых нужно выбрать необходимый для заполнения.

Текстовое поле предназначено для ввода названий секций. Одна строка – одна секция. Вложенность реализуется с помощью символов «-» перед названиями. Например, строки

Колбаса
-Докторская
--Свежая
--Просроченная
-Любительская
Сыр

соответствуют разделам 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

4 комментария “Автоматизируем создание структуры секций инфоблока в 1с-Битрикс

  1. PHPBox

    Руки еще не дошли до bitrix, вчитаюсь в ближайшее время повнимательней в ваши посты)

  2. Владимир

    Скрипт очень нужный.
    А не могли бы Вы данный скрипт адаптировать под последнюю версию Битрикса?
    Спасибо!

  3. Владимир

    Получилось Вашим скриптом загрузить разделы. Только нужно убирать в настройках инфоблока галочку обязательной генерации символьного кода.
    И символы для разделов нужно делать так:
    1. Без тире первый уровень.
    2. — одно тире второй уровень.
    3. — два тире третий уровень.

    Остался только вопрос с символьным кодом. А так, скрипт сэкономил кучу времени, спасибо!

Добавить комментарий

Ваш адрес email не будет опубликован.