Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Как создать меню из инфоблоков с элементами?

00 голосов
3
Добрый день, тема уже пережеванная, но все же не понятна. Многое перепробовал и результата, которого хотелось бы не наблюдаю.

Задача:
Вывести меню из инфоблоков подобной структуры:

Тип инфоблока
-Инфоблок
--Раздел 1
---Элемент 1
--Раздел 2
---Элемент 1
---Элемент 2
---Элемент 3
--Раздел 3
---Элемент 1

Пробовал через компонент bitrix:menu.sections, он выводит только разделы без элементов. Поэтому решил использовать API функции.

Код
<?
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/public_tools.php");
   $arrPath = pathinfo($_SERVER["REQUEST_URI"]);

   $rsIblock = GetIBlockList("catalog", Array("6"));
   $arIblock = $rsIblock->Fetch();
   $rsSection = GetIBlockSectionList($arIblock["ID"], false, Array("SORT"=>"DESC", "NAME" => "DESC", "ID"=>"DESC"));
   
   $aMenuLinksNew = array();
   while ($arSection = $rsSection->Fetch())
   {
      $SECTION_URL = "/dirname/".$arSection["CODE"].".php";
      $arrAddLinks = array();
      
      //Выборка элемента
      $rsItem = GetIBlockElementListEx("catalog", Array(), Array(), Array("ACTIVE_FROM"=>"DESC", "SORT"=>"ASC", "NAME"=>"DESC"), 10, Array("SECTION_ID"=>$arSection["ID"], "INCLUDE_SUBSECTIONS"=>"Y")); 
      
      //..
      $aMenuLinksNew[] = array(
         $arSection["NAME"],
         $SECTION_URL,
         $arrAddLinks,
    $aMenuItemNew);
   }
   
   $aMenuLinks = array_merge($aMenuLinksNew, $aMenuLinks);
?>


Идея проста: Делаем выборку всех разделов в инфоблоке ($rsSection) и элементов в этом разделе ($rsItem). Через цикл добавляем разделы и элементы в массив $aMenuLinksNew[]. Только как сделать древовидное меню не понятно.

У кого есть идеи? Или возможныо другие варианты?
спросил 26 Янв, 14 от FlatI (100 баллов)

3 Ответы

00 голосов
Следует учитывать следующие параметры:
$aMenuLinksNew[$menuIndex] = array(
"Название пункта меню",
"URL",
'',
array(
"FROM_IBLOCK" => true, всегда тру
"IS_PARENT" => true, говорит что это родитель и всё что ниже это дети. До момента пока не появиться такой же элемент с первым уровнем и с таким же параметром.
"DEPTH_LEVEL" => 1,
),
);
ДЕТИ:
$aMenuLinksNew[$menuIndex] = array(
"Название пункта меню",
"URL",
'',
array(
"FROM_IBLOCK" => true, всегда тру
"IS_PARENT" => false, // Указывается только после того как выше объявлен родитель
"DEPTH_LEVEL" => 2, // Уровень вложенности
),
);
ответил 25 Май, 14 от Viens (120 баллов)
00 голосов
Спасибо slips! ;)

Готовое решение:
Код
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/include.php");
   include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/public_tools.php");
   $arrPath = pathinfo($_SERVER["REQUEST_URI"]);

   $rsIblock = GetIBlockList("catalog", Array("6"));
   $arIblock = $rsIblock->Fetch();
   $rsSection = GetIBlockSectionList($arIblock["ID"], false, Array("ID"=>"ASC"));
   
   $aMenuLinksNew = array();
   while ($arSection = $rsSection->Fetch())
   {
      $SECTION_URL = "/dirname/".$arSection["CODE"].".php";
      $arrAddLinks = array();
      
      $aMenuLinksNew[] = array(
         $arSection["NAME"],
         $SECTION_URL,
         $arrAddLinks,
         array(
            "FROM_IBLOCK" => true,
            "IS_PARENT" => true,
            "DEPTH_LEVEL" => 1)
      );
      
      $rsItem = GetIBlockElementListEx("catalog", Array(), Array(), Array("ACTIVE_FROM"=>"DESC", "SORT"=>"ASC", "NAME"=>"DESC"), 10, Array("SECTION_ID"=>$arSection["ID"], "INCLUDE_SUBSECTIONS"=>"Y"));
      while ($arItem = $rsItem->Fetch())
      {
         $aMenuLinksNew[] =   array(
            $arItem["NAME"],
            $SECTION_URL,
            $arrAddLinks,
            array(
               "FROM_IBLOCK" => true,
               "IS_PARENT" => false, 
               "DEPTH_LEVEL" => 2, 
            )
         );   
      }
   }


Осталось только доработать мелкие детали.
ответил 21 Сен, 14 от FlatI (100 баллов)
00 голосов
Ну, если оформление в виде компонента и подключение кеширования для Вас мелкие детали, можно лишь порадоваться. Кстати, вместо функций типа GetIBlockSectionList рекомендуется использовать методы соответствующих классов.
ответил 25 Янв, 15 от Pomnep (13,960 баллов)

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

0 голосов
6 ответов
0 голосов
3 ответов
0 голосов
7 ответов
спросил 20 Июль, 13 от Hellbound (180 баллов)
0 голосов
1 ответ
спросил 24 Апр, 14 от Dominik (100 баллов)
0 голосов
3 ответов
спросил 24 Фев, 14 от salo (840 баллов)