Документация

Разделы

Методы DevBx\Core\Iblock для разделов. Читающие держат прочитанное в памяти запроса и общем кэше разделов — повторный вызов с тем же номером в базу не идёт.

Чтение

php
use DevBx\Core\Iblock;

$section  = Iblock::getSection($sectionId);              // один раздел
$sections = Iblock::getSectionsArray([12, 15, 21]);      // карта «номер => раздел»
$root     = Iblock::getRootSection($iblockId, $sectionId); // раздел первого уровня в цепочке
$children = Iblock::geSectionChildIDArray($sectionId);   // номера всех потомков
  • getSectionsArray принимает только массив: на другое значение бросает Bitrix\Main\ArgumentException. Значения приводятся к целым, уже прочитанные разделы берутся из кэша, за остальными идёт один запрос.
  • getRootSection берёт первое звено цепочки GetNavChain. Цепочки нет — вернётся сам раздел.
  • geSectionChildIDArray отдаёт номера всего поддерева по границам LEFT_MARGIN и RIGHT_MARGIN, а не только прямых потомков, и только активные разделы с активными родителями. Опечатка в имени (ge вместо get) — часть публичного имени метода.

Значение с наследованием

php
$picture = Iblock::getSectionValueRecursive($iblockId, $sectionId, 'PICTURE', false);

Поднимается по родителям до первого непустого значения поля. Дошли до корня и ничего не нашли — вернётся $defaultValue.

Номер инфоблока передавайте явно. Ветка, которая должна определить инфоблок по самому разделу, читает номер не из найденного раздела, а из списка полей выборки — и оставляет его пустым. С нулём в первом аргументе метод отдаст значение по умолчанию.

Поиск и создание

php
$id = Iblock::getSectionByName($iblockId, 'Чайники');            // точное совпадение названия
$id = Iblock::getSectionByXmlId($iblockId, 'KETTLES');           // по внешнему коду
$id = Iblock::addSectionByName($iblockId, 'Чайники');            // найти или создать
$id = Iblock::addSection(['IBLOCK_ID' => $iblockId, 'NAME' => 'Чайники']);
  • У обоих поисковых методов третий аргумент — номер родителя. Ноль означает «искать только на первом уровне», а не «в любом разделе».
  • getSectionByName сравнивает название точно, но обрезает пробелы по краям, и держит найденное в памяти запроса. getSectionByXmlId кэша не имеет.
  • addSection подбирает свободный символьный код: занят — припишет _1, _2 и так далее. Кода в полях нет — построит транслитерацией из названия. При отказе Битрикса бросает Bitrix\Main\SystemException с текстом ошибки.
  • addSectionByName сначала ищет, и создаёт только если не нашёл. Новому разделу достаётся сортировка на сотню больше, чем у самого «тяжёлого» соседа, — то есть он встаёт последним.

Символьный код и правила транслитерации

php
$code = Iblock::getCodeForSection($iblockId, 'Чайники и кофеварки');
$rules = Iblock::getIblockTranslitSection($iblockId); // настройки транслитерации разделов
$rules = Iblock::getIblockTranslitElement($iblockId); // то же для элементов

Правила берутся из настроек самого инфоблока — длина, регистр, замена пробелов и прочих знаков, склейка повторов. Занятый код получает суффикс _2, _3 и далее.