.
14 ноября 2013

Битрикс — иерархическое многоуровневое меню «гармошка»

posted in Bitrix, Программирование |

Итак, очередное ТЗ для Битрикс CMS — иерархическое многоуровневое меню «гармошка».
Реализацию сей задачи я конечно-же задумал с использованием какого-нить плагинчика с использованием jQuery (а куда без него в наше время ?), немного поиска и небольшой,
вполне устраивающий меня плагин найден — liHarmonica

Демка пашет, всё вроде бы просто, НО — как мне вытащить из Битрикса секции и иерархическом порядке?

Готового подходящего решения в API я не нашел, подходит только CIBlockSection::GetList () и рекурсивная функция по получению подсекций в конкретной секции.
Пихать непосредственно CIBlockSection::GetList () в рекурсивную фукнцию — убийство т.к. для каждой секции будет своё обращение в БД — слишком большая нагрузка для получения меню.

Как решение — сначала «дёрнуть» все секции в массив, и в дальнейшем работать уже с ним.
Ну для правильного кэширования всего задуманного, нужно будет запихать всё в компонент.

Сказано — сделано :)
Код в студию

component.php

if($this->StartResultCache(false, array($arParams["SECTION"],$arParams["ID"]))){
    CModule::IncludeModule("iblock");

    $arResult = array();
    $arResult['TIME'] = time();    

    $arFilter = Array('IBLOCK_ID'=>$arParams["IBLOCK_ID"], 'ACTIVE'=>'Y');
    $db_list = CIBlockSection::GetList(Array("sort"=>"asc"), $arFilter, false);
    while($ar_result = $db_list->GetNext()) {
	$sect_id = $ar_result['IBLOCK_SECTION_ID'];
	if(!$sect_id) $sect_id=0;

	$arr[$sect_id][]= array ('ID'=>$ar_result['ID'], 'NAME'=>$ar_result['NAME']);
    }

    $arResult['TREE'] = $arr;

    $this->SetResultCacheKeys(array('TREE'));
    $this->IncludeComponentTemplate();
}

template.php

    $value) { $id = $value["ID"]; $name = $value["NAME"]; if ($sec==$id) $class = 'class="cur"'; else $class =''; if (!is_array($arr[$id])) { echo "
  • $name
  • \n"; } else { echo "
  • $name
      \n"; print_menu($arr,$sec,$id); echo "
  • \n"; } } } ?>

P.S.
Блин, всего несколько строчек кода — а убил полдня на менюшку эту.
Кому интересно — качнуть готовый компонент можно тут, посмотреть реализацию тут.
(пути до js и css подкорректировать только нужно — у меня это в нескольких шаблонах используется, поэтому выносил в корень).

Яндекс.Метрика