Итак, очередное ТЗ для Битрикс 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 остается открытым, а у меня закрывается :(.