Задача: когда контент-менеджер создает раздел в инфоблоке, необходимо автоматически создавать подразделы с заранее заданными названиями.
Событие создания раздела 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 (можно изменить на свой метод генерации кода).

Код |
---|
<?php use Bitrix\Main\EventManager; use Bitrix\Main\Event; use Bitrix\Main\Loader; use Bitrix\Iblock\IblockTable; use Bitrix\Iblock\SectionTable; $eventManager = EventManager::getInstance(); $eventManager->addEventHandler('iblock', 'OnAfterIBlockSectionAdd', 'onAfterIBlockSectionAddHandler'); function onAfterIBlockSectionAddHandler(Event $event) { $arFields = $event->getParameter("fields"); $arResult = $event->getParameter("result"); 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) { $iblockId = $arFields["IBLOCK_ID"]; $sectionId = $arResult["ID"]; $name = $section["NAME"]; $code = $section["CODE"]; $result = SectionTable::add([ "IBLOCK_ID" => $iblockId, "IBLOCK_SECTION_ID" => $sectionId, "NAME" => $name, "CODE" => $code, ]); if (!$result->isSuccess()) { // Обработка ошибки при создании подраздела // например, можно записать ошибку в лог или вывести сообщение об ошибке $errors = $result->getErrorMessages(); echo "Ошибка при создании подраздела: " . implode(", ", $errors); } } } } ?> |
В этом примере используется пространство имен Bitrix\Main и классы из модуля iblock. Мы регистрируем обработчик события через EventManager и используем метод addEventHandler для регистрации обработчика на событие OnAfterIBlockSectionAdd.
В обработчике мы получаем значения полей раздела с помощью методов $event->getParameter("fields") и $event->getParameter("result"). Затем проходим по списку подразделов и создаем новые разделы с использованием класса SectionTable и метода add.
Код |
---|
$result = SectionTable::add([ "IBLOCK_ID" => $iblockId, "IBLOCK_SECTION_ID" => $sectionId, "NAME" => $name, "CODE" => $code, ]); |