Шаблончик меню
Периодически, рисуя менюшку, сталкиваюсь с не очень удобной кастомизацией дефолтных шаблонов.
Решил написать свой, универсальный:
Влженность - не ограничена, можно использовать разделители.
Код прокомментировал.
Ругайте, вдруг где накосячил.
Периодически, рисуя менюшку, сталкиваюсь с не очень удобной кастомизацией дефолтных шаблонов.
Решил написать свой, универсальный:
<?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; // та-даам
}
|
Код прокомментировал.
Ругайте, вдруг где накосячил.
Описал в блоге своё решение задачи