Упрощаем кастомизацию многоуровнего меню
Меню - это, пожалуй, самый неприятный блок для кастомизации на сайте. Не знаю, кого не встречал (себя в том числе) - не нравится его кастомить и все тут. Подход под катом развеет боязнь и даже самое страшное меню превратится в приятное глазу разработчика.
Прежде всего, я не советую брать стандартные шаблоны меню и "править их под себя", если только вы не верстальщик-интегратор в одном лице. Ибо css различны, блоки различны, очень много гемора вылезет. Посему, я советую для шаблона меню брать вот такой шаблон-костяк:
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();?>
<?if (!empty($arResult)):?>
<?foreach($arResult as $i => $arItem):?>
<a href="<?=$arItem['LINK']?>"><?=$arItem['TEXT']?></a>
<?endforeach?>
<?endif;?>
|
А теперь представим, что перед нами трехуровневое меню. Загляните в системный шаблон меню horizontal_multilevel и проникнетесь. Работает, использует какие-то хитрые приемы, но чудовищно для кастомизации.
Посему, к шаблону выше прилагается примерно такой result_modifier.php, который превращает линейное меню в дерево:
if (!empty($arResult)) {
$parentID = false;
$subParentID = false;
foreach($arResult as $i => $arItem) {
if ($arItem['DEPTH_LEVEL'] == 1) {
$parentID = $i;
$arResult[$i]['ITEMS'] = array();
} elseif ($arItem['DEPTH_LEVEL']==2 && $parentID!==false) {
$arResult[$parentID]['ITEMS'][$i] = $arItem;
$subParentID = $i;
unset($arResult[$i]);
} elseif ($arItem['DEPTH_LEVEL']==3 && isset($arResult[$parentID]['ITEMS'][$subParentID])) {
if (!isset($arResult[$parentID]['ITEMS'][$subParentID]['ITEMS'])) {
$arResult[$parentID]['ITEMS'][$subParentID]['ITEMS'] = array();
}
$arResult[$parentID]['ITEMS'][$subParentID]['ITEMS'][] = $arItem;
unset($arResult[$i]);
}
}
$arResult = array_values($arResult);
} |
Оригинал файла вы можете скачать в приложении к посту.Что получили и что выиграли?
1. Красивый и понятный код шаблона

2. 30-40 минут на кастомизацию такого меню:

Ну пусть час, чтобы накидать еще тестовые категории
Назад в раздел