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

Просмотров: 4602 | Комментариев: 17

Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоблока, например в карточке товара каталога- можно воспользоваться 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- для постороенния ссылки и название.

В общем-то и все, Остается это сверстать под свой дизайн.

Необходимо войти что бы оставить комментарий:
Stanislav2636
Привет.
Интересное решение описывается в вашей статье. Но у меня ЧПУ #catalog/#SECTION_CODE#/
Видимо, поэтому и не работает.
Не подскажете, какие правки в код внести, чтобы работало на SECTION_CODE ?
Михаил Базаров
Цитата
Stanislav2636 пишет:
echo 'Все товары: ';
Попоробуйте в этой строчке

Код
 echo 'Все товары: <a href="/catalog/'. $ar_group["ID"] . '/">'; 

Поменять ID на SECTION_CODE, по идее он тоже сюда передается
Или, получить SECTION_CODE зная ID раздела


Код
$arResult["SECTION_INFO"] = array();
$obSection = CIBlockSection::GetList(array(), "ID"=>$arSectionID); // где $arSectionID собранный вами массив
while($arSection = $obSection->Fetch();)
   $arResult["SECTION_INFO"][$arSection["ID"]] = $arSection; 
Иван Чухрай
Добрый день, Михаил! Отличное решение, Подскажите как вывести эти разделы в алфавитном порядке?
Михаил Базаров
Цитата
Иван Чухрай написал:
Добрый день, Михаил! Отличное решение, Подскажите как вывести эти разделы в алфавитном порядке?
Наверное, самое просто и не монструозное решение:
Загнать названия, моим способом, в массив.
Потом этот массив отсортировать по алфавиту, способом
Код
sort($ВАШМАССИВ, SORT_STRING);
ну и вывести все foreach- ем
Михаил Базаров
Отмена с массивом. Там можно конечно, на будет глупо не воспользоваться самим методом GetElementGroups
У него есть работа с сортировкой, соотвественно:
Код
$ElementId = $arResult['ID'];
    $db_groups = CIBlockElement::GetElementGroups($ElementId, SORT=>"NAME");
    while($ar_group = $db_groups->Fetch()) {
        echo 'Все товары: <a href="/catalog/'. $ar_group["ID"] . '/">';
        echo $ar_group["NAME"];
        echo "</a>";
}
Иван Чухрай
Цитата
Михаил Базаров пишет:
Отмена с массивом. Там можно конечно, на будет глупо не воспользоваться самим методом GetElementGroups
У него есть работа с сортировкой, соотвественно:
Код
 $ElementId = $arResult['ID'];
    $db_groups = CIBlockElement::GetElementGroups($ElementId, SORT=>"NAME");
    while($ar_group = $db_groups->Fetch()) {
        echo 'Все товары: <a href="/catalog/'. $ar_group["ID"] . '/">';
        echo $ar_group["NAME"];
        echo "</a>";
} 
При выполнении скрипта возникла ошибка.


А так все равно по алфавиту не сортирует:
Код
$db_groups = CIBlockElement::GetElementGroups($ElementId, array (SORT=>"NAME"));
jerrard.genry
Добрый день.
Михаил не могли бы помочь.
В 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_
не могли бы помочь? Спасибо
Михаил Базаров
Цитата
jerrard.genry написал:
Добрый день.
Михаил не могли бы помочь.
В result.modifier.php получаю все разделы элемента, но так как с GetElementGroups я не могу получить UF_ свойства, надо дальше прогнать GetList

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

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

Хочется понять как можно было только с CIBlockSectionGetList
Dmitry Egorov
Дай бог тебе здоровья. Выручил в очередной раз)))
Роман Селькин
Михаил, день добрый
Если у меня ЧПУ #catalog/#SECTION_CODE_PATH#/
Не подскажете, какие правки в код внести, чтобы работало на SECTION_CODE_PATH ?
Я еще новичек, если напишите полный код буду благодарен.
Михаил Базаров
Цитата
Роман Селькин пишет:
$ar_group
Сейчас негде проверить, посмотрите что там в массиве $ar_group, думаю пусть там есть
Код
<pre>
print_r($ar_group);
</pre>
Роман Селькин
Цитата
Михаил Базаров написал:
Цитата
Роман Селькин пишет:
$ar_group
Сейчас негде проверить, посмотрите что там в массиве $ar_group, думаю пусть там есть
Код
 <pre>
print_r($ar_group);
</pre>
 
Михаил, могу сделать доступ.
Роман Селькин
Цитата
Роман Селькин написал:

print_r($ar_group);
Вот что в массиве
Код
Array
(
    [ID] => 75
    [TIMESTAMP_X] => 2020-01-31 10:34:44
    [MODIFIED_BY] => 1
    [DATE_CREATE] => 2019-12-04 16:22:43
    [CREATED_BY] => 1
    [IBLOCK_ID] => 3
    [IBLOCK_SECTION_ID] => 
    [ACTIVE] => Y
    [GLOBAL_ACTIVE] => Y
    [SORT] => 500
    [NAME] => Детские кроватки
    [PICTURE] => 5468
    [LEFT_MARGIN] => 3
    [RIGHT_MARGIN] => 18
    [DEPTH_LEVEL] => 1
    [DESCRIPTION] => 
    [DESCRIPTION_TYPE] => text
    [SEARCHABLE_CONTENT] => ДЕТСКИЕ КРОВАТКИ

    [CODE] => detskie_krovatki
    [XML_ID] => 
    [TMP_ID] => 
    [DETAIL_PICTURE] => 
    [SOCNET_GROUP_ID] => 
    [LIST_PAGE_URL] => #SITE_DIR#/catalog/
    [SECTION_PAGE_URL] => #SITE_DIR#/catalog/#SECTION_CODE_PATH#/
    [IBLOCK_TYPE_ID] => nt_magnet_catalog
    [IBLOCK_CODE] => nt_magnet_catalog
    [IBLOCK_EXTERNAL_ID] => nt_magnet_catalog_s1
    [EXTERNAL_ID] => 
    [IBLOCK_ELEMENT_ID] => 2010
)
Маятник поперечныйArray
(
    [ID] => 84
    [TIMESTAMP_X] => 2019-12-15 15:05:21
    [MODIFIED_BY] => 1
    [DATE_CREATE] => 2019-12-04 17:26:57
    [CREATED_BY] => 1
    [IBLOCK_ID] => 3
    [IBLOCK_SECTION_ID] => 75
    [ACTIVE] => Y
    [GLOBAL_ACTIVE] => Y
    [SORT] => 500
    [NAME] => Маятник поперечный
    [PICTURE] => 5472
    [LEFT_MARGIN] => 8
    [RIGHT_MARGIN] => 9
    [DEPTH_LEVEL] => 2
    [DESCRIPTION] => 
    [DESCRIPTION_TYPE] => text
    [SEARCHABLE_CONTENT] => МАЯТНИК ПОПЕРЕЧНЫЙ

    [CODE] => mayatnik_poperechnyy
    [XML_ID] => 
    [TMP_ID] => 
    [DETAIL_PICTURE] => 
    [SOCNET_GROUP_ID] => 
    [LIST_PAGE_URL] => #SITE_DIR#/catalog/
    [SECTION_PAGE_URL] => #SITE_DIR#/catalog/#SECTION_CODE_PATH#/
    [IBLOCK_TYPE_ID] => nt_magnet_catalog
    [IBLOCK_CODE] => nt_magnet_catalog
    [IBLOCK_EXTERNAL_ID] => nt_magnet_catalog_s1
    [EXTERNAL_ID] => 
    [IBLOCK_ELEMENT_ID] => 2010
)
Михаил Базаров
Да, пути тут нет, его можно получить с помощью CIBlockSection::GetNavChain
Вы знаете ID раздела, выведите вот так
Код
$sectionFullPath = CIBlockSection::GetNavChain(false,$ar_group['ID']);
  while($arSectionPath = $sectionFullPath->GetNext()){
    print_r($arSectionPath)
  } 
} 
Скорее всего, среди прочего получите полный путь
Роман Селькин
Цитата
Михаил Базаров написал:
$sectionFullPath = CIBlockSection::GetNavChain(false,$ar_group['ID']);
 while($arSectionPath = $sectionFullPath->GetNext()){
   print_r($arSectionPath)
 }
}
А куда это вставить. Можно поподробнее?
Роман Селькин
Вставил данный код/ При выполнении скрипта возникла ошибка.
Михаил Базаров
Цитата
Роман Селькин написал:
$sectionFullPath = CIBlockSection::GetNavChain(false,$ar_group['ID']);  while($arSectionPath = $sectionFullPath->GetNext()){    print_r($arSectionPath)  } }
Вот так
Код
$ElementId = $arResult['ID'];
    $db_groups = CIBlockElement::GetElementGroups($ElementId, true);
    while($ar_group = $db_groups->Fetch()) {

   $sectionFullPath = CIBlockSection::GetNavChain(false,$ar_group['ID']);
    while($arSectionPath = $sectionFullPath->Fetch()){
      print_r($arSectionPath)
    }
}


Роман Селькин
Опять ошибка скрипта.
Михаил Базаров
Цитата
Роман Селькин написал:
Опять ошибка скрипта.
Лишняя скобка } в конце была
Роман Селькин
Цитата
Михаил Базаров написал:
Цитата
Роман Селькин написал:
Опять ошибка скрипта.
Лишняя скобка } в конце была
Код
Array ( [ID] => 98 [TIMESTAMP_X] => 2020-05-30 22:20:50 [MODIFIED_BY] => 1 [DATE_CREATE] => 2020-05-30 13:01:54 [CREATED_BY] => 1 [IBLOCK_ID] => 3 [IBLOCK_SECTION_ID] => [ACTIVE] => Y [GLOBAL_ACTIVE] => Y [SORT] => 502 [NAME] => Постельные принадлежности [PICTURE] => 12747 [LEFT_MARGIN] => 27 [RIGHT_MARGIN] => 60 [DEPTH_LEVEL] => 1 [DESCRIPTION] => [DESCRIPTION_TYPE] => text [SEARCHABLE_CONTENT] => ПОСТЕЛЬНЫЕ ПРИНАДЛЕЖНОСТИ [CODE] => postelnye-prinadlezhnosti [XML_ID] => [TMP_ID] => [DETAIL_PICTURE] => 12748 [SOCNET_GROUP_ID] => [LIST_PAGE_URL] => #SITE_DIR#/catalog/ [SECTION_PAGE_URL] => #SITE_DIR#/catalog/#SECTION_CODE_PATH#/ [IBLOCK_TYPE_ID] => nt_magnet_catalog [IBLOCK_CODE] => nt_magnet_catalog [IBLOCK_EXTERNAL_ID] => nt_magnet_catalog_s1 [EXTERNAL_ID] => ) Array ( [ID] => 98 [TIMESTAMP_X] => 2020-05-30 22:20:50 [MODIFIED_BY] => 1 [DATE_CREATE] => 2020-05-30 13:01:54 [CREATED_BY] => 1 [IBLOCK_ID] => 3 [IBLOCK_SECTION_ID] => [ACTIVE] => Y [GLOBAL_ACTIVE] => Y [SORT] => 502 [NAME] => Постельные принадлежности [PICTURE] => 12747 [LEFT_MARGIN] => 27 [RIGHT_MARGIN] => 60 [DEPTH_LEVEL] => 1 [DESCRIPTION] => [DESCRIPTION_TYPE] => text [SEARCHABLE_CONTENT] => ПОСТЕЛЬНЫЕ ПРИНАДЛЕЖНОСТИ [CODE] => postelnye-prinadlezhnosti [XML_ID] => [TMP_ID] => [DETAIL_PICTURE] => 12748 [SOCNET_GROUP_ID] => [LIST_PAGE_URL] => #SITE_DIR#/catalog/ [SECTION_PAGE_URL] => #SITE_DIR#/catalog/#SECTION_CODE_PATH#/ [IBLOCK_TYPE_ID] => nt_magnet_catalog [IBLOCK_CODE] => nt_magnet_catalog [IBLOCK_EXTERNAL_ID] => nt_magnet_catalog_s1 [EXTERNAL_ID] => ) Array ( [ID] => 100 [TIMESTAMP_X] => 2020-05-30 23:05:05 [MODIFIED_BY] => 1 [DATE_CREATE] => 2020-05-30 13:15:09 [CREATED_BY] => 1 [IBLOCK_ID] => 3 [IBLOCK_SECTION_ID] => 98 [ACTIVE] => Y [GLOBAL_ACTIVE] => Y [SORT] => 500 [NAME] => Детские комплекты в кроватку [PICTURE] => 12750 [LEFT_MARGIN] => 28 [RIGHT_MARGIN] => 29 [DEPTH_LEVEL] => 2 [DESCRIPTION] => [DESCRIPTION_TYPE] => text [SEARCHABLE_CONTENT] => ДЕТСКИЕ КОМПЛЕКТЫ В КРОВАТКУ [CODE] => detskie-komplekty-v-krovatku [XML_ID] => [TMP_ID] => [DETAIL_PICTURE] => [SOCNET_GROUP_ID] => [LIST_PAGE_URL] => #SITE_DIR#/catalog/ [SECTION_PAGE_URL] => #SITE_DIR#/catalog/#SECTION_CODE_PATH#/ [IBLOCK_TYPE_ID] => nt_magnet_catalog [IBLOCK_CODE] => nt_magnet_catalog [IBLOCK_EXTERNAL_ID] => nt_magnet_catalog_s1 [EXTERNAL_ID] => )

Авторизация

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