В данной статье речь пойдет о малоизвестных полях секции инфоблока left- и right-margin, которые позволяют одним вызовом функции CIBlockSection::GetList получить практически любую информацию о вложенных\родительских разделах. Для начала пробежимся по теоретической части, а когда все станет ясно с алгоритмом заполнения этих полей, приведем конкретный пример использования.

Сортировка и представление данных

Каждый раздел в системе Битрикс имеет несколько параметров, влияющих на его положение в дереве. В первую очередь это поле SORT, которое можно заполнить при создании или редактировании. Оно влияет на сортировку разделов одного уровня вложенности относительно единого родителя. Уровень вложенности всегда можно узнать из поля DEPTH_LEVEL (=1 для корневых разделов, =2 для первого уровня вложенности и т.д.). Таким образом, поле SORT используется для «локальной» сортировки.

Продемонстрировать процедуру определения значений параметров left- и right-margin поможет рисунок ниже

Разделы инфоблоков Битрикс — используем архитектурные особенности

Цифры слева от разделов — это left-margin, справа — right-margin. Начиная от самого верхнего уровня (с наименьшим SORT) последовательно вписываем значения left-margin, заходя во все подразделы, пока не встретится один из случаев:

  1. у раздела нет потомков, но есть нижестоящие категории с одинаковым уровнем вложенности (DEPTH_LEVEL), в примере «b», «d», «g». В этом случае вписываем для раздела right-margin=left-margin+1 и двигаемся дальше вниз по левой стороне.
  2. у раздела нет потомков и вложенных\нижестоящих узлов — «e», «f», «i». Для него также right-margin=left-margin+1 и дальнейшее движение идет вверх по правой стороне. Уже заполненные значения пропускаем (правое число для «b», «d», «g» при движении вверх)

Практическое применение

Один из самых часто используемых случаев — получение свойства родительского раздела. Например, вывод описания секции каталога самого верхнего уровня независимо от вложенности текущего из шаблона компонента catalog.section. Решается задача добавлением в шаблон кода

CModule::IncludeModule('iblock');
$dbSect = CIBlockSection::GetList(Array("SORT"=>"ASC"), Array("IBLOCK_ID"=>$arResult["IBLOCK_ID"], "<=LEFT_BORDER" => $arResult["LEFT_MARGIN"], ">=RIGHT_BORDER" => $arResult["RIGHT_MARGIN"], "DEPTH_LEVEL" => 1), false); 
if($arSect = $dbSect->GetNext()) {echo $arSect["DESCRIPTION"];}

LEFT_BORDER и RIGHT_BORDER — аналоги margin’ов, которые понимают условие типа «неравенство»