Bitrix вывод дерева разделов

Форум

Вывод всего дерева каталога в catalog.section.list, Как выводить в разделах каталога все дерево подразделов через catalog.section.list?

Сделала меню-аккордеон из catalog.section.list. Вызываю один и тот же компонент из обоих файлов section.php и sections.php — в одном случае с указанием «SECTION_ID», в другом без него (как в исходных компонентах по-сути).

  1. Как сделать, чтоб при переходе с главного уровня каталога в подраздел отображалось все дерево разделов, а не только текущий?
  2. Как сделать так, чтоб активный раздел открывался в меню при переходе в этом раздел?
"SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"],

то список разделов на странице подраздела перестает корректно работать.

Очень прошу вашей помощи, знаю, что на форуме много умных и не жадных до знаний ребят ))

В «SECTION_ID» поставьте 0, добавьте параметр «CURRENT_SECTION_ID»=> $arResult[«VARIABLES»][«SECTION_ID»].
В шаблоне определяйте активность $arSection[«ID»]==$arParams[«CURRENT_SECTION_ID»]

Евгений Малков, спасибо огромное за подсказку! Не могли бы вы уточнить, добавить параметр «CURRENT_SECTION_ID» — нужно в файле component.php ? И где именно нужно задавать «SECTION_ID» равным 0 — в шаблоне, настройке компонента или там же в component.php ?

Антон Пилецкий, спасибо, но при организации меню через компонент меню есть свои сложности, из-за которых и решено было делать меню через catalog.section.list, в частности:

1) вывод описания и изображений разделов;
2) вывод элементов каталога тут же в меню.

Цитата
Наталья Семёнова пишет:
Евгений Малков , спасибо огромное за подсказку! Не могли бы вы уточнить, добавить параметр «CURRENT_SECTION_ID» — нужно в файле component.php ? И где именно нужно задавать «SECTION_ID» равным 0 — в шаблоне, настройке компонента или там же в component.php ?

Евгений Малков, такой способ я уже пробовала, но при этом перестают подгружаться подразделы (сделано на основе шаблона tree).. Не подскажете, как можно реализовать это с подрузкой подразделов?

у catalog.section.list параметр TOP_DEPTH (Максимальная отображаемая глубина разделов) указан?
Попробуйте «SECTION_ID» =>»» или вообще убрать

Цитата
Евгений Малков пишет:
у catalog.section.list параметр TOP_DEPTH (Максимальная отображаемая глубина разделов) указан?
Попробуйте «SECTION_ID» =>»» или вообще убрать
Читайте также:  Маленькие желтые ягоды дерево

В шаблоне TOP_DEPTH задается строкой: $TOP_DEPTH = $arResult[«SECTION»][«DEPTH_LEVEL»];
В вызове компонента catalog.section.list глубина указана: «TOP_DEPTH» => $arParams[«SECTION_TOP_DEPTH»],
Так же в вызове компонента каталога указан параметр: «SECTION_TOP_DEPTH» => «3»,

Если не определять SECTION_ID, то не подгружаются подкаталоги — работает только верхний уровень.

Центр поддержки

Продукты

Управление сайтом

Битрикс24

Интернет-магазин + CRM

Решения

Для интернет-магазинов

Каталог готовых решений

Внедрение

Выбрать партнера

Проверить партнера

Стать партнером

1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

Контент для лиц от 16 лет и старше

© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности

Источник

Получение иерархии разделов

Приведу небольшой примерчик как одним запросом и одним циклом получить иерархию разделов в виде:

Array ( [ROOT] => Array ( [CHILD] => Array ( [12] => Array ( [ID] => 12 [~ID] => 12 [NAME] => Раздел с ид 12 [~NAME] => Раздел с ид 12 [DEPTH_LEVEL] => 1 [~DEPTH_LEVEL] => 1 [CHILD] => Array ( [63] => Array ( [ID] => 63 [~ID] => 63 . [CHILD] => Array ( . ) ) . [63] => Array ( [ID] => 63 [~ID] => 63 . ) . ) ) . ) ) )

На мой взгляд, с такой структурой работать в большинстве случаев удобнее, чем со списком, отсортированном по LEFT_MARGIN

 $arFilter = array( 'ACTIVE' => 'Y', 'IBLOCK_ID' => $arParams['IBLOCK_ID'], 'GLOBAL_ACTIVE'=>'Y', ); $arSelect = array('IBLOCK_ID','ID','NAME','DEPTH_LEVEL','IBLOCK_SECTION_ID'); $arOrder = array('DEPTH_LEVEL'=>'ASC','SORT'=>'ASC'); $rsSections = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect); $sectionLinc = array(); $arResult['ROOT'] = array(); $sectionLinc[0] = &$arResult['ROOT']; while($arSection = $rsSections->GetNext()) < $sectionLinc[intval($arSection['IBLOCK_SECTION_ID'])]['CHILD'][$arSection['ID']] = $arSection; $sectionLinc[$arSection['ID']] = &$sectionLinc[intval($arSection['IBLOCK_SECTION_ID'])]['CHILD'][$arSection['ID']]; >unset($sectionLinc); 

Если мы получаем только активные элементы, то важно указать в фильтре ‘GLOBAL_ACTIVE’=>’Y’, иначе мы можем получить активный элемент с неактивным предком, и его некуда будет определить в иерархию.

В $arSelect нужно не забыть указать IBLOCK_SECTION_ID, иначе иерархию построить не получится

Первое поле в сортировке $arOrder должно быть ‘DEPTH_LEVEL’=>’ASC’, так как иерархия строится от предков к потомкам

Построение иерархии происходит через массив ссылок $sectionLinc

Источник

Вывод дерева разделов

Добрый день. Стоит такая задача: Есть каталог игр, мне нужно при заходе в каждый раздел с игрой вывести многоуровневое меню со всеми ее подразделами.

Как не пытался получить подразделы, они либо общим списком, либо только верхний уровень.

Читайте также:  Чем удалить поросли деревьев

Подскажите как правильнее решается эта задача? — Я создал тип меню, создал файл с расширением menu_ext.php, добавил компонент menu.sections, получаю весь перечень подразделов. Вот интересует код, который этот перечень преобразует в массив с правильной вложенностью подразделов

У вас уровни хранятся плоско (гуглите Nested Sets) и всегда есть DEPTH_LEVEL (уровень вложенности), LEFT_MARGIN (левое смещение) и RIGHT_MARGIN (правое смещение).
Соответственно по ним можете и свернуть все что захотите, но спойлер: битрикс не создает вложенных массивов, а разворачивает их так же плоско (смотрите шаблон любого multilevel меню)

А подскажите как мне сделать меню, в котором пункты будут только того раздела, в котором мы находимся?

Павел Поляков, для начала нужно в *_ext файле определить в каком пункте меню вы находитесь. а дальше все как и обычно, только с фильтром по верхнему разделу.

Продукты

Управление сайтом

Битрикс24

Интернет-магазин + CRM

Решения

Для интернет-магазинов

Каталог готовых решений

Внедрение

Выбрать партнера

Проверить партнера

Стать партнером

1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

Контент для лиц от 16 лет и старше

© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности

Источник

Форум

Необходимо выстроить дерево состоящее из элементов и разделов некоторого инфоблока, причем по принципу: «сначала каталоги, потом файлы»:

Раздел 1
Раздел 2
Раздел 2
Раздел 3
Элемент 3
Элемент 3
Раздел 2
Элемент 2
Элемент 2
.
.
Элемент 1
.
.

Окончательный массив, аналогичен массиву пунктов меню.

Мое предварительное решение было таким:

1. Получаем список разделов («LEFT_MARGIN» => «ASC»)
2. Для каждого раздела получаем список его элементов
3. В дополнительном цикле собираем массив с нужной последовательностью элементов и разделов

Быть может существует более оптимальное решение? Например, какой-нибудь хитро построенный запрос, позволяющий получить все и сразу и в нужной последовательности Буду рад любым идеям

Судя по всему, нет. Прежде всего, метод не позволяет выбрать пользовательские поля разделов, и если я правильно понимаю, существенного выигрыша от его использования в решении данной задачи я не получаю — те же два запроса, да еще и с урезанными возможностями.. Впрочем, должен сказать, что я и не надеялся сократить количество запросов, а вот избавиться от последнего цикла хотелось бы. Просто предположил, что данная задача уже кем-то решалась, и был найден оптимальный подход

Читайте также:  Мешают ли деревья сотовой связи

1. Сформировать массив секций (по LEFT_MARGIN), ключами массива сделать ID секции.
2. Забить ID секций в массив.
3. Запросить список элементов, передав в фильтре секции.
4. Профетчить элементы, присоединяя каждый в нужную секцию массива секций по ключу.
5. Нарисовать результирующий массив в шаблоне.

Компонент (и.с.) — существительное мужского рода (ГОСТ 34.003-90).

Спасибо, Дмитрий! В итоге, что-то в этом роде у меня и получилось.. правда, реальное дерево несколько сложнее, чем мной описано выше. Приведу здесь сокращенный код того что вышло, может быть кому-то пригодится:

/*********** * Разделы * ***********/ $rs_section = CIBlockSection::GetList(Array("LEFT_MARGIN" => "ASC"), $arFilter, true, Array("UF_*")); while($ar_section = $rs_section->Fetch()) < $arResult["SECTIONS"][$ar_section["ID"]] = $ar_section; >/************ * Элементы * ************/ $rs_element = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ar_element = $rs_element->GetNext(false, false)) < if(array_key_exists($ar_element["IBLOCK_SECTION_ID"], $arResult["ELEMENTS"])) < $arResult["ELEMENTS"][$ar_element["IBLOCK_SECTION_ID"]][$ar_element["ID"]] = $ar_element; >else < $arResult["ELEMENTS"][$ar_element["IBLOCK_SECTION_ID"]] = Array(); $arResult["ELEMENTS"][$ar_element["IBLOCK_SECTION_ID"]][$ar_element["ID"]] = $ar_element; >> /********************* * Построение дерева * *********************/ $previousLevel = 0; $arStack = Array(); foreach($arResult["SECTIONS"] as $arSection) < if($previousLevel && $arSection["DEPTH_LEVEL"] > > > $arResult["ITEMS"][] = $arSection; $arStack[] = $arSection["ID"]; $previousLevel = $arSection["DEPTH_LEVEL"]; >

Я выпустил компонент для построения дерева инфоблока из разделов и элементов — http://marketplace.1c-bitrix.ru/solutions/twozebras.infoblocktree/

/*********** * Разделы * ***********/ $rs_section = CIBlockSection::GetList(Array("LEFT_MARGIN" => "ASC"), $arFilter, true, Array("UF_*")); while($ar_section = $rs_section->Fetch()) < $arResult["SECTIONS"][$ar_section["ID"]] = $ar_section; >/************ * Элементы * ************/ $rs_element = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ar_element = $rs_element->GetNext(false, false)) < if(array_key_exists($ar_element["IBLOCK_SECTION_ID"], $arResult["ELEMENTS"])) < $arResult["ELEMENTS"][$ar_element["IBLOCK_SECTION_ID"]][$ar_element["ID"]] = $ar_element; >else < $arResult["ELEMENTS"][$ar_element["IBLOCK_SECTION_ID"]] = Array(); $arResult["ELEMENTS"][$ar_element["IBLOCK_SECTION_ID"]][$ar_element["ID"]] = $ar_element; >> /********************* * Построение дерева * *********************/ $previousLevel = 0; $arStack = Array(); foreach($arResult["SECTIONS"] as $arSection) < if($previousLevel && $arSection["DEPTH_LEVEL"] > > > $arResult["ITEMS"][] = $arSection; $arStack[] = $arSection["ID"]; $previousLevel = $arSection["DEPTH_LEVEL"]; >

А зачем приравнивать $previousLevel = 0 ? В данном коде у вас дерево не построется! Поменял на 1, и у меня заработало. Спасибо!

Центр поддержки

Продукты

Управление сайтом

Битрикс24

Интернет-магазин + CRM

Решения

Для интернет-магазинов

Каталог готовых решений

Внедрение

Выбрать партнера

Проверить партнера

Стать партнером

1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

Контент для лиц от 16 лет и старше

© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности

Источник

Оцените статью