Разделы
Методы DevBx\Core\Iblock для разделов. Читающие держат прочитанное в памяти запроса и общем
кэше разделов — повторный вызов с тем же номером в базу не идёт.
Чтение
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) — часть публичного имени метода.
Значение с наследованием
$picture = Iblock::getSectionValueRecursive($iblockId, $sectionId, 'PICTURE', false);
Поднимается по родителям до первого непустого значения поля. Дошли до корня и ничего не нашли —
вернётся $defaultValue.
Номер инфоблока передавайте явно. Ветка, которая должна определить инфоблок по самому разделу, читает номер не из найденного раздела, а из списка полей выборки — и оставляет его пустым. С нулём в первом аргументе метод отдаст значение по умолчанию.
Поиск и создание
$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сначала ищет, и создаёт только если не нашёл. Новому разделу достаётся сортировка на сотню больше, чем у самого «тяжёлого» соседа, — то есть он встаёт последним.
Символьный код и правила транслитерации
$code = Iblock::getCodeForSection($iblockId, 'Чайники и кофеварки');
$rules = Iblock::getIblockTranslitSection($iblockId); // настройки транслитерации разделов
$rules = Iblock::getIblockTranslitElement($iblockId); // то же для элементов
Правила берутся из настроек самого инфоблока — длина, регистр, замена пробелов и прочих знаков,
склейка повторов. Занятый код получает суффикс _2, _3 и далее.