Вывести дерево разделов битрикс

Bitrix catalog.section как сделать вывод разделов и элементов?

Нужно вывести элементы отсортированные по разделам на одной странице.

Например: Раздел 1<Элемент1, Элемент2, Элемент3>, потом на этой же странице ниже Раздел 2 <Элемент1, элемент2, элемент3>и.т.д.

Через result_modifer смог получить название раздела для каждого элемента:

foreach ($arResult[‘ITEMS’] as $key => $arItem)
<
$arSectionList = array();
$rsSections = CIBlockElement::GetElementGroups($arItem[‘ID’]);
while ($arSection = $rsSections->Fetch())
<
$arSectionList[] = array(
‘ID’ => $arSection[‘ID’],
‘NAME’ => $arSection[‘NAME’],
);
>
$arItem[‘SECTION_NAME’] = $arSectionList;
$arResult[‘ITEMS’][$key] = $arItem;
>

Теперь хочу собрать массив вида Раздел 1<Элемент1, Элемент2, Элемент3>. Подскажите решение.

  • Вопрос задан более трёх лет назад
  • 29237 просмотров

Запрос в цикле — ай-яй-яй, как плохо.

А вообще вот прямо для этого решения:

И на выходе получишь $arResult[‘ITEMS_BY_GROUP’] где ключами будут ID разделов, а значениями массивы содержащие ключи элементов ITEMS принадлежащих этому разделу.
Но если много элементов то вот это вот: CIBlockElement::GetElementGroups надо выносить за пределы цикла.

в result_modifier.php изменить

Мне человек для вывода отдельными группами элементов из подразделов предложил вот такой вариант:

в result_modifier.php шаблона вывода списка примерно так:

в template.php обычный цикл по $arResult[‘COL_циферка’] 3 раза и фильтр в таком случае не нужен.

Самый простой способ, «в лоб»:
Если каталог небольшой ( CIBlockSection::GetTreeList()
Далее перебираем полученный массив разделов и для каждого раздела выбираем все принадлежащие ему элементы
CIBlockElement::GetList()

— но будет огромное кол-во лишних запросов. Можно обойтись двумя:
1. выбираем все разделы CIBlockSection::GetTreeList()
2. выбираем все элементы CIBlockElement::GetList()
3. объединяем два массива в один.

Источник

Структура разделов

Описание catalog.section.list

Компонент выводит список разделов инфоблока. Компонент стандартный, входит в дистрибутив модуля и содержит 4 шаблона: .default, old_version (шаблон .default до версии 14.0), tree и visual.

В визуальном редакторе компонент расположен по пути Контент > Каталог > Структура разделов.

Компонент относится к модулю Информационные блоки.

Параметры

Поле Параметр Описание Примечание
Основные параметры
Тип инфо-блока IBLOCK_TYPE Указывается один из созданных в системе типов информационных блоков.
Инфо-блок IBLOCK_ID Для выбранного типа инфоблоков указывается идентификатор необходимого информационного блока.
ID раздела SECTION_ID Указывается код, в котором передается идентификатор раздела.
Код раздела SECTION_CODE Указывается код раздела.
Источник данных
Показывать количество элементов в разделе COUNT_ELEMENTS [Y|N] При отмеченной опции будет показано количество элементов в разделе.
Максимальная отображаемая глубина разделов TOP_DEPTH Параметр определяет максимальную глубину отображаемых разделов.
Поля разделов SECTION_FIELDS Указываются поля раздела, которые будут отображены на странице структуры разделов. Заполняется из публичной части редактора, удерживая клавишу Ctrl либо в коде, указывая массив: При выборе пункта (не выбрано)-> и без указания вычисления полей в строках ниже (т.е. если задан пустой массив) ничего отображаться не будет.
Свойства раздела SECTION_USER_FIELDS Указываются свойства раздела, которые будут отображены на странице. Заполняется из публичной части редактора, удерживая клавишу Ctrl либо в коде, указывая массив. При выборе пункта (не выбрано)-> и без указания вычисления полей в строках ниже, свойства не будут выведены.
Имя массива со значениями фильтра разделов FILTER_NAME Задается имя переменной, в которую передается массив параметров из фильтра. Если имя массива не указано, то будет использоваться значение по умолчанию.
Внешний вид (для шаблона .default и visual)
Вид списка подразделов VIEW_MODE Определяется способ отображения списка подразделов: в виде списка (LINE), многоуровнего списка (LIST), текста (TEXT) или плитки (TILE).
Показывать название раздела SHOW_PARENT_NAME [Y|N] При отмеченной опции будет выводится название раздела (кроме раздела верхнего уровня).
Шаблоны ссылок
URL, ведущий на страницу с содержимым раздела SECTION_URL Указывается путь к странице с содержимым раздела.
Настройки кеширования
Тип кеширования CACHE_TYPE Тип кеширования:
  • A — Авто + Управляемое: автоматически обновляет кеш компонентов в течение заданного времени или при изменении данных;
  • Y — Кешировать: для кеширования необходимо определить время кеширования;
  • N — Не кешировать: кеширования нет в любом случае.
Время кеширования (сек.) CACHE_TIME Время кеширования, указанное в секундах.
Учитывать права доступа CACHE_GROUPS [Y|N] При отмеченной опции будут учитываться права доступа при кешировании.
Дополнительные настройки
Включать раздел в цепочку навигации ADD_SECTIONS_CHAIN [Y|N] При отмеченной опции название или заголовок (если задан в настройках SEO) раздела будет включен в цепочку навигации.
Служебные параметры (не отображаются в настройках компонента)
Кастомная сортировка по произвольному числу параметров CUSTOM_SECTION_SORT Данный служебный параметр можно передать в вызове компонента. Тип параметра — массив. Структура массива соответствует ключу $arOrder метода CIBlockSection::GetList. Доступно с версии модуля iblock 20.0.400.
Параметр не используется в штатных шаблонах комплексного компонента catalog.

Пример вызова

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

Чтобы выбрать все пользовательские поля раздела укажите

Источник

Как выбрать все вложенные разделы указав ID родителя

Здравствуйте. Как можно вытащить при помощи битрикс все вложенные разделы, указанного родительского раздела?

‘INCLUDE_SUBSECTIONS’=>’Y’ не помогает, тк он выбирает вложенные разделы первого уровня. А у вложенных разделов, есть еще вложенные разделы.

Здоровье
—Медицинские кадры
—Качество медицинских услуг
—Лекарственное обеспечение
—Нацпроект «Здоровье»
——материнство и детство
——медпомощь больным с сердечно-сосудистыми заболеваниями
——Медпомощь при ДТП
——онкологическая помощь
—Профилактика
—Санаторно-курортное лечение

Если сделать: ‘SECTION_ID’ — Здоровье, то выберутся категории:
—Медицинские кадры
—Качество медицинских услуг
—Лекарственное обеспечение
—Нацпроект «Здоровье»
—Профилактика
—Санаторно-курортное лечение

а как сделать, чтобы выбирались все?

Цитата
Александр Кудин пишет:
в arrFilter добавь элемент с ключом DEPTH_LEVEL и со значением 3

Не работает:
$arFilter = Array(‘IBLOCK_ID’=>10,’SECTION_ID’=>23, ‘INCLUDE_SUBSECTIONS’ =>’Y’, ‘DEPTH_LEVEL’ =>3);

не выводит ничего

т.к. раздел 23 имеет ‘DEPTH_LEVEL’ 2. Вот так работает:

$arFilter = Array(‘IBLOCK_ID’=>10,’SECTION_ID’=>23, ‘INCLUDE_SUBSECTIONS’ =>’Y’, ‘DEPTH_LEVEL’ =>2);

Цитата
Андрей Антипов пишет:
http://dev.1c-bitrix.ru/support/faq/8368/#112801

Аналогичная проблема: в инфоблоке три раздела, вложенность каждого из которых нужно посмотреть по отдельности. И указанный выше функционал не подходит..

Подскажите, есть ли более простой способ посмотреть вложенность разделов (без построения дополнительных циклов поиска внутри каждого раздела) ?

Ответ нашла в документации, в пользовательских комментариях.

Евгений Жуков 24.05.2011 12:52:29
Пример выборки дерева подразделов для раздела

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

Вот функция, которая выбирает все вложенные разделы указав ID раздела родителя . (Выбирает и внуков и правнуков и т.д.)
Сделал через CIBlockSection::GetList , в 1 запрос .
Документация https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblocksection/getlist.php

/*Эта функция вспомогательная, чтоб смотреть подразделы*/
function GetAllSectionInSel($SECTION_ID, $arParent) <
$arR=array();
for($i=0,$k=count($arParent[$SECTION_ID]);$i function GetAllSectionIn($IBLOCK_ID, $SECTION_ID, $arFilter, $arSelect)<

if($arSelect==’ID’) < //если нужны только ид
$IDon=true;
$arSelect=array(‘ID’,’IBLOCK_SECTION_ID’);
>else <
$arSelect=array_merge(array(‘ID’,’IBLOCK_SECTION_ID’),$arSelect);
>

$obSection=CIBlockSection::GetList(
array(),
array_merge(array(‘IBLOCK_ID’=>$IBLOCK_ID),$arFilter),
false,
$arSelect,
false
);

$arAlId=array(); //Для хранения результатов
$arParent=array(); //Для хранения детей разделов
while($arResult=$obSection->GetNext())<

$arAlId[$arResult[‘ID’]]=$arResult;
if(!is_array($arParent[$arResult[‘IBLOCK_SECTION_ID’]])) < //Если родителя в списке нет, то добавляем
$arParent[$arResult[‘IBLOCK_SECTION_ID’]]=array();
>
array_push($arParent[$arResult[‘IBLOCK_SECTION_ID’]], $arResult[‘ID’]);

$arR=GetAllSectionInSel($SECTION_ID, $arParent); //Ид всех детей и правнуков

if(!$IDon) < //Если необходим не только ид
$arId=$arR;
$arR=array();
for($i=0,$k=count($arId);$i Пример использования 1
$arr1=GetAllSectionIn(20, 296, array(), array(‘NAME’));
echo ‘ ‘;

Выведет результат
Array
(
[0] => Array
(
[ID] => 897
[

ID] => 897
[IBLOCK_SECTION_ID] => 896
[

IBLOCK_SECTION_ID] => 896
[NAME] => Готовая основа
[

NAME] => Готовая основа
)

ID] => 898
[IBLOCK_SECTION_ID] => 896
[

IBLOCK_SECTION_ID] => 896
[NAME] => Пищевые ароматизаторы
[

NAME] => Пищевые ароматизаторы
)

ID] => 899
[IBLOCK_SECTION_ID] => 898
[

IBLOCK_SECTION_ID] => 898
[NAME] => Baker Flavors
[

Пример использования 2 (только ид)
$arr1=GetAllSectionIn(20, 896, array(), ‘ID’);
echo ‘ ‘;

Выведет результат
Array
(
[0] => 897
[1] => 898
[2] => 899
[3] => 900
[4] => 901
[5] => 902
[6] => 903
[7] => 904
[8] => 905
[9] => 930
[10] => 931
[11] => 932
[12] => 933
..

Рекомендую кешировать данный запрос.
#450142079

Источник

iredun / dep.php

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

$ res = CIBlockSection :: GetList (
Array ( ‘name’ => ‘asc’ ),
Array ( ‘IBLOCK_ID’ => ‘5’ , ‘ACTIVE’ => ‘Y’ )
);
while ( $ row = $ res -> GetNext ())
<
echo $ row [ ‘NAME’ ]. ‘
‘ ;
$ rsParentSection = CIBlockSection :: GetByID ( $ row [ ‘ID’ ]);
if ( $ arParentSection = $ rsParentSection -> GetNext ())
<
$ arFilter = array ( ‘IBLOCK_ID’ => $ arParentSection [ ‘IBLOCK_ID’ ], ‘>LEFT_MARGIN’ => $ arParentSection [ ‘LEFT_MARGIN’ ], ‘ => $ arParentSection [ ‘RIGHT_MARGIN’ ], ‘>DEPTH_LEVEL’ => $ arParentSection [ ‘DEPTH_LEVEL’ ]); // выберет потомков без учета активности
$ rsSect = CIBlockSection :: GetList ( array ( ‘left_margin’ => ‘asc’ ), $ arFilter );
while ( $ arSect = $ rsSect -> GetNext ())
<
echo ‘—‘ . $ arSect [ ‘NAME’ ]. ‘
‘ ;
>
>
>
?>

This comment has been minimized.

Copy link Quote reply

Roman-Moschenskiy commented Dec 11, 2019 •

А зачем повторно получать раздел по ID, если он уже есть в первой выборке? Оптимизировал код вот так:

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Читайте также:  Нужно ли стирать эластичные бинты
Оцените статью