Итак, очередное ТЗ для Битрикс CMS – иерархическое многоуровневое меню “гармошка”.
Реализацию сей задачи я конечно-же задумал с использованием какого-нить плагинчика с использованием jQuery (а куда без него в наше время ?), немного поиска и небольшой,
вполне устраивающий меня плагин найден – liHarmonica
Демка пашет, всё вроде бы просто, НО – как мне вытащить из Битрикса секции и иерархическом порядке?
Готового подходящего решения в API я не нашел, подходит только CIBlockSection::GetList() и рекурсивная функция по получению подсекций в конкретной секции.
Пихать непосредственно CIBlockSection::GetList() в рекурсивную фукнцию – убийство т.к. для каждой секции будет своё обращение в БД – слишком большая нагрузка для получения меню.
Как решение – сначала “дёрнуть” все секции в массив, и в дальнейшем работать уже с ним.
Ну для правильного кэширования всего задуманного, нужно будет запихать всё в компонент.
Сказано – сделано 🙂
Код в студию
component.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<div style=“width:200px; float:left; margin:0 0px 20px 0”> <ul class=“anyClass2 skinClear”> <? $sec = $arParams[“ACTIVE_SECTION_ID”]; print_menu($arResult[‘TREE’], $sec, 0); function print_menu($arr, $sec, $sid) { foreach ($arr[$sid] as $key => $value) { $id = $value[“ID”]; $name = $value[“NAME”]; if ($sec==$id) $class = ‘class=”cur”‘; else $class =”; if (!is_array($arr[$id])) { echo “<li> <a $class href=’/catalog/section-$id/’>$name</a></li>\n”; } else { echo “<li><a $class href=’/catalog/section-$id/’>$name</a><ul>\n”; print_menu($arr,$sec,$id); echo “</ul></li>\n”; } } } ?> </ul> </div> |
P.S.
Блин, всего несколько строчек кода – а убил полдня на менюшку эту.
Кому интересно – качнуть готовый компонент можно тут, посмотреть реализацию тут.
(пути до js и css подкорректировать только нужно – у меня это в нескольких шаблонах используется, поэтому выносил в корень).
Один комментарий на «“Битрикс – иерархическое многоуровневое меню “гармошка””»
Здравствуйте. Спасибо за меню, с битриксом только начинаю работать, очень непривычно после других CMS, ранее работал с DLE и WordPress.
Возникла одна проблема – код скопировал в точности, но после перехода во вложенную рубрику в меню и перехода открытые пункты меню сворачиваются, а в вашей демо сотаются открытыми.
По вашему примеру наапример открываем Воздушные фильты и выпадает Swegon, переходим в Swegon, и в меню слева пункт Swegon остается открытым, а у меня закрывается :(.