- Bitrix catalog.section как сделать вывод разделов и элементов?
- Структура разделов
- Описание catalog.section.list
- Параметры
- Пример вызова
- Пользовательские комментарии
- Как выбрать все вложенные разделы указав ID родителя
- iredun / dep.php
- This comment has been minimized.
- Roman-Moschenskiy commented Dec 11, 2019 •
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 | Тип кеширования:
| |
Время кеширования (сек.) | 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.
Источник