Вывести все разделы в которых находится элемент инфоблока

Просмотров: 19094

Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоблока, например в карточке товара каталога- можно воспользоваться API методом CIBlockElement::GetElementGroups

Перелинковка на разделы, в которых находится элемент каталога

Например: У нас есть каталог товаров, элементы которого могут находиться сразу в нескольких разделах инфоблока. Внутри карточки товара, мы хотим вывести ссылки на все разделы, в которых эта каточка находится. Что бы пользователям-покупателям было удобно отбирать товары

Пусть, визуально, это будет выглядеть так. Настройки ЧПУ для разделов инфоблока /catalog/#SECTION_ID#/

Для этого достаточно вывести названия и ID всех разделов в которых находится товар и сверстать.
Воспользуемся API методом CIBlockElement::GetElementGroups.


$ElementId = $arResult['ID'];
    $db_groups = CIBlockElement::GetElementGroups($ElementId, true);
    while($ar_group = $db_groups->Fetch()) {
        echo 'Все товары: <a href="/catalog/'. $ar_group["ID"] . '/">';
        echo $ar_group["NAME"];
        echo "</a>";
}

В коде, я не использую фильтр, в $ar_group хранится вообще вся информация о разделах: картинка, символьный код, дата создания итд. Но вывожу только ID- для постороенния ссылки и название.

Улучшение, c SEO параметрами

Получаем полный URL до каждого раздела и в качестве названия берем не его настоящее название, а заголовок из SEO настроек раздела.

$db_groups = CIBlockElement::GetElementGroups($arResult['ID'], true);
while ($ar_group = $db_groups->Fetch()) {
    $dbRes = CIBlockSection::GetList(
        false,
        array(
            'ID' => $ar_group["ID"]
        ),
        false,
        false,
        array (
            'ID',
            'NAME',
            'SECTION_PAGE_URL'
        )
    );
    while ($arDbRes = $dbRes->GetNext()) {
        $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
            $arResult['IBLOCK_ID'],
            $arDbRes["ID"]
        );?>
        <a href="<?echo $arDbRes['SECTION_PAGE_URL'];?>">
          <?echo $ipropValues->getValues()['SECTION_META_TITLE']?>
        </a>
        <?
    }
}

С помощью CIBlockSection::GetList получили нужную информацию о разделе (получение NAME тоже оставил). И с помощью \Bitrix\Iblock\InheritedProperty\SectionValues получли настройки из SEO параметров раздела

Да, можно было воспользоваться CIBlockSection::GetByID вместо CIBlockSection::GetList, но нагрузка будет чуть выше, так как CIBlockSection::GetByID это обвертка над CIBlockSection::GetList и пытается получить все поля раздела с лишними запросами к БД

Stanislav2636 11.07.2018
Привет.
Интересное решение описывается в вашей статье. Но у меня ЧПУ #catalog/#SECTION_CODE#/
Видимо, поэтому и не работает.
Не подскажете, какие правки в код внести, чтобы работало на SECTION_CODE ?
jerrard.genry 30.04.2020
Добрый день.
Михаил не могли бы помочь.
В result.modifier.php получаю все разделы элемента, но так как с GetElementGroups я не могу получить UF_ свойства, надо дальше прогнать GetList

Код
foreach ($arResult['ITEMS'] as $key => $arItem)
{
    $arSectionList = array();
    $rsSections = CIBlockElement::GetElementGroups($arItem['ID']);
    while ($arSection = $rsSections->GetNext())
    {
        $arSectionList[] = array(
            'ID' => $arSection['ID'],
            'NAME' => $arSection['NAME'],
            'SECTION_PAGE_URL' => $arSection['SECTION_PAGE_URL'],
        );
    }
    $arItem['SECTION_LIST'] = $arSectionList;
    $arResult['ITEMS'][$key] = $arItem;
}



$arSection = CIBlockSection::GetList(
    Array(  ),
    Array(
        "ACTIVE" => "Y",
        "IBLOCK_ID" => 2,
        "ID" => $arSection['ID'],     
    ),
    false,
    Array(
        "ID",
        "UF_*"
    )
)->fetch();


Не получаю то, что мне нужно. Понимаю что не так сделал , не силен в этом.
Как мне добавить в полученный массив SECTION_LIST к каждому элементу дополнительно все свойства UF_
не могли бы помочь? Спасибо
Михаил Базаров 30.04.2020
Цитата
jerrard.genry написал:
Добрый день.
Михаил не могли бы помочь.
В result.modifier.php получаю все разделы элемента, но так как с GetElementGroups я не могу получить UF_ свойства, надо дальше прогнать GetList

Не получаю то, что мне нужно. Понимаю что не так сделал , не силен в этом.
Как мне добавить в полученный массив SECTION_LIST к каждому элементу дополнительно все свойства UF_
не могли бы помочь? Спасибо
Если уж, все равно используете CIBlockSection::GetList - может только его и оставить? Смысл проделывать двойной прогон?
И GetNext вместо Fetch
jerrard.genry 07.05.2020
Цитата
Михаил Базаров написал:
Цитата
jerrard.genry написал:
Добрый день.
Михаил не могли бы помочь.
В result.modifier.php получаю все разделы элемента, но так как с GetElementGroups я не могу получить UF_ свойства, надо дальше прогнать GetList

Не получаю то, что мне нужно. Понимаю что не так сделал , не силен в этом.
Как мне добавить в полученный массив SECTION_LIST к каждому элементу дополнительно все свойства UF_
не могли бы помочь? Спасибо
Если уж, все равно используете CIBlockSection::GetList - может только его и оставить? Смысл проделывать двойной прогон?
И GetNext вместо Fetch
Удалось реализовать связкой GetElementGroups  и CIBlockSectionGetList, я так и не допер как можно решить вопрос только лиш с CIBlockSection::GetList, я не могу получить список всех разделов к которым привязан элемент.
Можете показать пример решения пожалуйста или направить в нужную сторону?

Хочется понять как можно было только с CIBlockSectionGetList
Dmitry Egorov 11.05.2020
Дай бог тебе здоровья. Выручил в очередной раз)))
Егор 17.05.2023
Михаил, а добавить к этому решению вывод разделов в алфавитном порядке не планируется? Подскажите как правильно применить.
Михаил Базаров 17.05.2023
Вот так, работоспособность проверена.
Только учтите, что будет сортировка именно по названию раздела, а не по его SECTION_META_TITLE
Код
$ElementId = $arResult['ID'];
$db_groups = CIBlockElement::GetElementGroups($arResult['ID'], true);
while ($ar_group = $db_groups->Fetch()) {
    $arGroups[] = $ar_group["ID"]; // Создаем массив с группами
}
$dbRes = CIBlockSection::GetList(
    array(
        'NAME' => 'ASC', // И прочие виды сортировок
    ),
    array(
        'IBLOCK_ID' => $arResult['IBLOCK_ID'], // Для скорости, что бы не перебирало все инфоблоки
    ),
    false,
    array (
        'ID',
        'NAME',
        'SECTION_PAGE_URL'
    )
);
while ($arDbRes = $dbRes->GetNext()) {
    if (!in_array($arDbRes['ID'], $arGroups)) {
        continue; // Если группы нет в массиве продолжаем, иначе выводим
    }
    $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues(
        $arResult['IBLOCK_ID'],
        $arDbRes["ID"]
    );?>
    <a href="<?echo $arDbRes['SECTION_PAGE_URL'];?>">
        <?echo $ipropValues->getValues()['SECTION_META_TITLE']?>
    </a>
    <?
}