Задача: когда контент-менеджер создает раздел в инфоблоке, необходимо автоматически создавать подразделы с заранее заданными названиями.
Событие создания раздела OnAfterIBlockSectionAdd
Для реализации данной задачи используется событие OnAfterIBlockSectionAdd, которое вызывается после попытки добавления нового раздела информационного блока.
В файле /local/php_interface/init.php (если его не существует, создайте его) добавьте следующий код:
AddEventHandler("iblock", "OnAfterIBlockSectionAdd", "OnAfterIBlockSectionAddHandler");
function OnAfterIBlockSectionAddHandler(&$arFields)
{
if ($arFields["IBLOCK_ID"] == 1) { // Замените 1 на ID нужного инфоблока
$sectionList = array(
array(
"NAME" => "Подраздел 1",
"CODE" => "pod_razdel_1",
),
array(
"NAME" => "Подраздел 2",
"CODE" => "pod_razdel_2",
),
// Добавьте остальные подразделы в список
);
foreach ($sectionList as $section) {
$arNewSection = array(
"IBLOCK_ID" => $arFields["IBLOCK_ID"],
"IBLOCK_SECTION_ID" => $arFields["ID"],
"NAME" => $section["NAME"],
"CODE" => $section["CODE"],
);
$bs = new CIBlockSection();
$newSectionID = $bs->Add($arNewSection);
}
}
}
В данном примере обработчик события проверяет, создается ли раздел в определенном инфоблоке (путем проверки ID инфоблока), и автоматически создает соответствующие подразделы из заранее заданного списка.
В массиве $sectionList добавлены элементы, где каждый элемент содержит название подраздела (NAME) и его код (CODE). Вы можете добавлять или изменять элементы в массиве $sectionList, чтобы указать нужные подразделы.
В цикле перебора $sectionList вызывается метод CIBlockSection::Add для каждого подраздела, указывая необходимые параметры (название, код и т. д.). Также передаем параметр "IBLOCK_SECTION_ID" => $arFields["ID"], чтобы каждый создаваемый подраздел стал дочерним разделом вновь созданного раздела.
Создание подразделов на выбор из заданного списка
Улучшенный способ создания подразделов. Для этого используется множественное пользовательское свойство типа "Привязка к элементам инфоблока", а также список элементов в связанном инфоблоке (например, города России).
Теперь контент-менеджер может выбирать конкретные элементы из списка, и названия этих элементов станут подразделами при создании раздела.

В файле init.php улучшаем код обработчика до такого сосотояния.
AddEventHandler("iblock", "OnAfterIBlockSectionAdd", "OnAfterIBlockSectionAddHandler");
function OnAfterIBlockSectionAddHandler(&$arFields)
{
if ($arFields["IBLOCK_ID"] == 1) { // Замените 1 на ID нужного инфоблока
$sectionListPropertyCode = "UF_V_CITY";
$elementList = $arFields[$sectionListPropertyCode];
foreach ($elementList as $elementID) {
$elementName = ""; // Здесь будет храниться название элемента
// Получите название элемента по его ID
if (CModule::IncludeModule("iblock")) {
$arElement = CIBlockElement::GetByID($elementID)->Fetch();
if ($arElement) {
$elementName = $arElement["NAME"];
}
}
if (!empty($elementName)) {
$arNewSection = array(
"IBLOCK_ID" => $arFields["IBLOCK_ID"],
"IBLOCK_SECTION_ID" => $arFields["ID"],
"NAME" => $elementName,
"CODE" => CUtil::translit($elementName, "ru"), // Генерация кода на основе названия
);
$bs = new CIBlockSection();
$newSectionID = $bs->Add($arNewSection);
}
}
}
}
В данном примере обработчик события проверяет, создается ли раздел в определенном инфоблоке (с проверкой ID инфоблока). Затем он перебирает выбранные элементы в свойстве UF_V_CITY (замените на код свойства "Привязка к элементам").
Для каждого элемента получаем его название с помощью функции CIBlockElement::GetByID. Затем создается подраздел на основе названия элемента, используя полученное название, а также генерируется код подраздела с помощью функции CUtil::translit (можно изменить на свой метод генерации кода).