Шаблончик меню
Периодически, рисуя менюшку, сталкиваюсь с не очень удобной кастомизацией дефолтных шаблонов.
Решил написать свой, универсальный:
Влженность - не ограничена, можно использовать разделители.
Код прокомментировал.
Ругайте, вдруг где накосячил.
Периодически, рисуя менюшку, сталкиваюсь с не очень удобной кастомизацией дефолтных шаблонов.
Решил написать свой, универсальный:
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <? if (!empty($arResult)) { // Шаблон для списка первого уровня $arStrMenu[1] = '<ul class="left-menu">#ITEMS#</ul>'; // Шаблон для пунктов первого уровня $arStrItems[1] = '<li class="#PARENT# #DISABLED#">'. '<a href="#LINK#" class="#SELECTED#">'. '#TEXT#'. '</a>'. '#MENU#'. '</li> '; // Шаблон для разделителя первого уровня // В качестве разделителя выступает пункт меню без ссылки $arStrSeparator[1] = '<li class="#PARENT# #DISABLED#"><h2>#TEXT#</h2></li>'; // То же для второго уовня $arStrMenu[2] = '<ul class="submenu">#ITEMS#</ul>'; $arStrSeparator[2] = '<li class="#SELECTED# #PARENT# #DISABLED#"><h2>#TEXT#</h2></li>'; $arStrItems[2] = '<li class="#SELECTED# #PARENT# #DISABLED#">'. '<a href="#LINK#" >'. '#TEXT#'. '</a>'. '#MENU#'. '</li> '; $arParent[1] = "#1"; foreach ($arResult as $key => $arItem) { // если пункт имеет подпункты, сохраним уникальный ID пункта и уровень вложенности if($arItem["IS_PARENT"]) $arParent[$arItem["DEPTH_LEVEL"]+1] = $key."#".($arItem["DEPTH_LEVEL"]+1); $arReplace = array( "#SELECTED#" => $arItem["SELECTED"] ? "active" : "", // класс для выбранного пункта "#PARENT#" => $arItem["IS_PARENT"] ? "treeview" : "", // класс для пункта с подпунктами "#DISABLED#" => $arItem["PERMISSION"] <= "D" ? "disabled" : "", // класс для недоступного пункта "#ICO#" => $arItem["PARAMS"]["ico"], // берем название иконки из параметров пункта "#TEXT#" => $arItem["TEXT"], "#LINK#" => $arItem["LINK"], "#MENU#" => $arItem["IS_PARENT"] ? "#MENU".$key."#" : "", // вставляем код, заменяемый подпунктами ); $template = $arItem["LINK"] ? "arStrItems" : "arStrSeparator"; // если нет ссылки - считаем пункт разделителем // создаем небольшой массив, где пункты склеены в строки по шаблону, ключ - ID#DEPTH_LEVEL $items[$arParent[$arItem["DEPTH_LEVEL"]]] .= str_replace( array_keys($arReplace), $arReplace, ${$template}[$arItem["DEPTH_LEVEL"]] ); } $strMenu = "#MENU#"; // первый уровень foreach($items as $key => $item) { $strBranch = ""; // обнуляем ветку list($id, $dl) = explode("#", $key); // Разбираем ключ // если уровень вложенности больше количества шаблонов, используем последний шаблон $dl = count($arStrMenu) < $dl ? count($arStrMenu) : $dl; // заполняем меню пунктами, для каждого уровня - свой шаблон $strBranch .= str_replace("#ITEMS#", $item, $arStrMenu[$dl]); // если есть код подменю, вставим вместо него подпункты $strMenu = str_replace("#MENU".$id."#", $strBranch, $strMenu); } echo $strMenu; // та-даам } |
Код прокомментировал.
Ругайте, вдруг где накосячил.