Разделы инфоблоков Битрикс – используем архитектурные особенности
Опубликовано 14 Ноя 2010
В данной статье речь пойдет о малоизвестных полях секции инфоблока 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’ов, которые понимают условие типа «неравенство»



Алексей, хорошая информация, спасибо, именно об этом никогда не задумывался почему то. Однако показывая \»живой пример\» в виде кода, хотелось бы больше пояснений и пример результата этого кода – так будет нагляднее.
Учту, как-то не подумал об этом сразу.
А как отсортировать разделы по алфавиту не взирая на SORT?
Игорь, если вопрос в том, как функцией GetList получить список разделов, отсортированных по алфавиту – то для этого используется 1й параметр функции. Например Array(«NAME»=>»ASC») отсоритирует по названиям по возрастанию.
Доброй ночи, Алексей! Пытался использовать ваш пример, но результата не получил. Создал компонент на основе catalog.sections.list, вставил в шаблон ваш код – и ничего. Понимаю, что где-то ошибся, но не могу понять, где…
Владимир, порядок действий такой. Кидаем на страницу компонент catalog.section (можно комплексный catalog) – копируем виз. средствами шаблон компонента – в режиме редактирования шаблона компонента вставляем код
Алексей, вроде все так и сделал. Кинул на страницу свой компонент, вставил код в шаблон… Такое ощущение, что или dbSect или arSect не заполняется.
Даже не знаю тогда, надо на месте разбираться
Как человеку не любящему Битрикс, но интересующемуся Лефт Райт марджинами в структурх каталогов – ни хрена не понятно.. Если точнее – совсем чуть чуть
понятно как нумеруется… а практическое применение ? зачем они надо то эти маржины?
Интересно, кто то сможет сказать зачем они нужны?
Примеры… практические… жизненные..
Давайте давайте )
Плюс от googla не нашел, поставлю так +
Спасибо! Помогло.
Тоже ничего не выводит DESCRIPTION пустой ничего нет, информация выводится у меня только по тому где нахожусь, никакого сквозного меню или чего в массиве я не нашел.