- yunaliev.ru
- Программирование, как и искусство — одно слово, за которым скрывается бесконечное множество занятий 😉
- Разделы инфоблока в виде массива 1С-Битрикс
- Битрикс. Простой компонент «Структура разделов»
- Как выбрать все вложенные разделы указав ID родителя
- Структура разделов
- Описание catalog.section.list
- Параметры
- Пример вызова
- Пользовательские комментарии
yunaliev.ru
Программирование, как и искусство — одно слово, за которым скрывается бесконечное множество занятий 😉
Разделы инфоблока в виде массива 1С-Битрикс
Что такое список разделов в информационном блоке, это данные структурированные в виде дерева.
Есть несколько вариантов обхода дерева, вот что говорит wikipedia
Пошаговый перебор элементов дерева по связям между узлами-предками и узлами-потомками называется обходом дерева. Зачастую, операция может быть выполнена переходом указателя по отдельным узлам. Обход, при котором каждый узел-предок просматривается прежде его потомков называется предупорядоченным обходом или обходом в прямом порядке (pre-order walk), а когда просматриваются сначала потомки, а потом предки, то обход называется поступорядоченным обходом или обходом в обратном порядке (post-order walk). Существует также симметричный обход, при котором посещается сначала левое поддерево, затем узел, затем — правое поддерево, и обход в ширину, при котором узлы посещаются уровень за уровнем (N-й уровень дерева — множество узлов с высотой N). Каждый уровень обходится слева направо.
По умолчанию используется, обход в ширину.
Возвращает массив вида
Видно что у раздела Аккумуляторы по моделям есть подразделы и они находятся сразу под своим родителем, в этом и заключается особенность такой выборки, мы получаем ассоциативный массив с отсортированный структурой дерева. Для вывода на сайте это вполне удобно, в основном это применяется в выводе в тэге
Мне всегда было удобно работать с массивами, и я хотел иметь список разделов с подразделами в виде массива, возможно в большинстве случаев это и не нужно, и в случае с хранением данных в массиве при выводе нужна рекурсия, я все же попробовал собрать дерево в массив.
Использовать будем поступорядоченный метод обхода, по этому сначала найдем максимальный DEPTH_LEVEL, получаем его в переменную $i_MaxDepthLevel и начинаем в цикле собирать массив с самих глубоких по иерархии разделов. Раздел после добавления в массив родитель удаляем unset( $ar_SectionList[$i_SectionID] );
Важный момент, сортировка списка должно идти именно в таком направлении array(‘DEPTH_LEVEL’ => ‘desc’) при этом подготовленный массив разделов перед сборкой будет иметь вид
т.е мы начинаем перебор с разделов с наибольшим DEPTH_LEVEL в результате получаем дерево в виде заветного массива, кусок дампа
Как видим удалось построить массив, но как теперь его выводить и вообще работать с ним? Во первых мы можем обращаться к определенным разделам по ключам, выдергивать части массива и тд, все что можно сделать с массивом данных.
Для вывода всего массива необходимо использовать рекурсию, думаю тема актуально для построения меню для сайта
На выходе получим
Если есть способы сделать тоже самое легче, быстрее, правильнее и тд, прошу написать в комментарии 🙂
Источник
Битрикс. Простой компонент «Структура разделов»
На главной странице сайта, в правой колонке, надо вывести список категорий блога. Для решения это задачи используем простой компонент «Структура разделов», который предназначен для вывода списка разделов инфоблока. Как обычно, чтобы получить код вызова компонента со всеми параметрами, переходим на тестовую страницу и вызываем визуальный редактор. Выбираем в правой колонке компонент «Контент • Каталог • Структура разделов».
Копируем код вызова компонента и выходим без сохранения:
Комментируем в шаблоне local/templates/voguis_index/footer.php HTML-код вывода списка последних постов блога и вставляем на это место вызов компонента:
Переходим на главную страницу сайта, включаем режим правки и копируем шаблон компонента:
Задаем имя шаблона blog_ctgs и выбираем куда копировать:
Файл шаблона local/templates/voguis_index/footer.php был перезаписан, теперь вызов компонента выглядит так:
Скопированный шаблон у нас теперь в директории local/templates/voguis_index/components/bitrix/catalog.section.list/blog_ctgs . Удаляем файл стилей style.css и открываем шаблон template.php на редактирование.
Перед тем, как удалить из файла шаблона весь мусор, который напихали в него разработчики Битрикс, сохраним несколько полезных фрагментов:
Источник
Как выбрать все вложенные разделы указав 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
Источник
Структура разделов
Описание 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. |
Пример вызова
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Чтобы выбрать все пользовательские поля раздела укажите
Источник