Skip to content

Instantly share code, notes, and snippets.

@helloris25
Last active February 4, 2018 17:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save helloris25/835eda7d941fed85a961 to your computer and use it in GitHub Desktop.
Save helloris25/835eda7d941fed85a961 to your computer and use it in GitHub Desktop.
Быстрое создание секций битриксе
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetPageProperty("NOT_SHOW_NAV_CHAIN", "Y");
$APPLICATION->SetTitle("Импорт секций инфоблока");
if(CModule::IncludeModule("iblock")) {
$arIBlocks = [];
$rsIBlocks = CIBlock::GetList(["sort" => "asc"], ["ACTIVE" => "Y"]);
while($arIBlock = $rsIBlocks->Fetch())
{
$arIBlocks[] = ["ID" => $arIBlock["ID"], "NAME" => $arIBlock["NAME"], "IBLOCK_TYPE" => $arIBlock["IBLOCK_TYPE_ID"]];
}
}
if(strlen($_POST["list"]) > 0) $arStr = split("\n", $_POST["list"]);
$IBlockID = intval($_POST["iblock"]);;
$lastLevel = 1000;
$arLevels = [];
$errorTrigger = false;
if(count($arStr) > 0 && $IBlockID > 0) {
$arStr[0] = TrimEx(trim($arStr[0]), "-", "left"); // первый элемент должен быть на 0м уровне
$bs = new CIBlockSection;
$arFields = [
"ACTIVE" => "Y",
"IBLOCK_ID" => $IBlockID,
];
foreach($arStr as $strItem) {
$level = 0; // текущий уровень вложености
$strItem = trim($strItem);
while (substr($strItem, 0, 1) == '-') { // определяем уровень по числу "-", заодно удаляем их
$level++;
$strItem = substr($strItem, 1);
}
$arFields["NAME"] = $strItem; // имя в массив
//Транслитерируем имя
$translitName = Cutil::translit($strItem, "ru", ["replace_space" => "-", "replace_other" => "-"]);
// Если такой же код есть допишем ему номер
$countDiffCode = CIBlockSection::GetList([], ['CODE' => $translitName])->SelectedRowsCount();
if ($countDiffCode > 0) $translitName .= $countDiffCode + 1;
$arFields["CODE"] = $translitName; // символьный код
if($level == 0) { // уровень вложенности 0 - нет родительской секции
$lastLevel = 0;
}
elseif($level > $lastLevel) { // текущей уровень больше прошлого, идем вглубь структуры
if($arLevels[$lastLevel]) {// если есть корректный предок, то заносим в поля. Иначе - будет в корне
$arFields["IBLOCK_SECTION_ID"] = $arLevels[$lastLevel];
}
$lastLevel = $lastLevel + 1;
if($arLevels[$level - 1]) {
$arFields["IBLOCK_SECTION_ID"] = $arLevels[$level - 1];
}
$lastLevel = $level;
}
$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;
}
}
CIBlockSection::ReSort($IBlockID); // второй параметр функции Add =false, поэтому необходимо сделать ReSort
if(!$errorTrigger) echo '<span style="color:#009900">Секции успешно созданы</span><br /><br />';
}
?>
<p>Выпадающий список содержит все инфоблоки системы в виде Тип инфоблока – Название инфоблока, среди которых нужно выбрать необходимый для заполнения.</p>
<p>Текстовое поле предназначено для ввода названий секций. Одна строка – одна секция. Вложенность реализуется с помощью символов «-» перед названиями. Например, строки</p>
Колбаса<br>
-Докторская<br>
—Свежая<br>
—Просроченная<br>
-Любительская<br>
Сыр<br>
<p>соотетствуют разделам 1го уровня «Сыр» и «Колбаса», в «Колбасу» вложены «Докторская» и «Любительская», в «Докторской» есть разделы «Свежая» и «Просроченная».</p>
<form action="/section_import.php" method="post">
<select name="iblock" style="width:300px;">
<?php foreach($arIBlocks as $arItem):?>
<option value="<?php =$arItem["ID"]?>"<?php if(intval($_POST["iblock"])==$arItem["ID"]) echo 'selected="selected"';?>><?=$arItem["IBLOCK_TYPE"]?> - <?=$arItem["NAME"]?></option>
<?php endforeach; ?>
</select><br />
<textarea name="list" style="width:300px; height:150px;"><?php if($_POST["list"]) echo $_POST["list"];?></textarea><br />
<input type="submit" value="Создать разделы" />
</form>
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
@helloris25
Copy link
Author

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

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

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

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

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

соотетствуют разделам 1го уровня «Сыр» и «Колбаса», в «Колбасу» вложены «Докторская» и «Любительская», в «Докторской» есть разделы «Свежая» и «Просроченная».

Для использования скрипта скачайте архив внизу страницы, распакуйте файл в корневую директорию сайта и запустите http://имя_сайта/section_import.php


Это немного измененный скрипт с этого сайта http://alexvaleev.ru/section-import/
Я добавил создание символьного кода секции.

@zf-1
Copy link

zf-1 commented Jan 25, 2017

В форме неправильный action="section_import.php"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment