@Sky161
Начинающий Web-разработчик

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}. Подскажите решение.
  • Вопрос задан
  • 33451 просмотр
Решения вопроса 1
Запрос в цикле - ай-яй-яй, как плохо.

А вообще вот прямо для этого решения:
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'],
            );
        $arResult['ITEMS_BY_GROUP'][$arSection['ID']][] = $key;
    }
    $arItem['SECTION_NAME'] = $arSectionList;
    $arResult['ITEMS'][$key] = $arItem;

}

И на выходе получишь $arResult['ITEMS_BY_GROUP'] где ключами будут ID разделов, а значениями массивы содержащие ключи элементов ITEMS принадлежащих этому разделу.
Но если много элементов то вот это вот: CIBlockElement::GetElementGroups надо выносить за пределы цикла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Rad1calDreamer
@Rad1calDreamer
наткнулся когда-то на просторах. взял себе, иногда переделываю)
https://github.com/Rad1calDreamer/bitrix.article.list
тут и компонент и базовый шаблон
Ответ написан
babarun
@babarun Куратор тега 1С-Битрикс
Безумный план моих идей в руках больных людей
Самый простой способ, "в лоб":
Если каталог небольшой (<1000), то с начала выбираем все разделы
CIBlockSection::GetTreeList()
Далее перебираем полученный массив разделов и для каждого раздела выбираем все принадлежащие ему элементы
CIBlockElement::GetList()

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

Если вы упомянули result_modifer значит вы используете какой-то компонент, скорее всего это или news.list, или catalog.section. Проще написать свой чем переделывать готовый.
Ответ написан
Комментировать
@ZardoZAntony
программист, сис. админ
А разве компонент bitrix:catalog.sections.top делает не то что нужно? Указываем для топ элементов число с большим запасом и всё.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы