Перейти к содержанию

Примеры решения частных задач в меню

Подсветка ссылок

Поле Доп.ссылки для подсветки в расширенной форме редактирования меню позволяет включать подсветку определенных пунктов при переходе на страницу. Это бывает нужно в случаях, когда пользователь не должен забывать, откуда он пришел, либо для обращения внимания на определенную страницу.

При посещении страницы, указанной в поле Доп.ссылки для подсветки, будет происходить подсветка настраиваемого пункта меню. Путь к страницам задается относительно корня сайта.

Как сделать, чтобы отдельный пункт меню открывался в новом окне?

Для этого нужно в расширенном режиме редактирования прописать у нужных пунктов следующие дополнительные параметры:

Название: target 
Значение: target="_blank"

В шаблоне меню, после вывода элемента меню, необходимо заменить код:

<a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>

на следующий:

<a href="<?=$arItem["LINK"]?>" <?=$arItem["PARAMS"]["target"]?>><?=$arItem["TEXT"]?></a>

Отображение пункта меню для определенных групп пользователей

В расширенном режиме редактирования меню для желаемого пункта необходимо выбрать тип условия равный Для групп пользователей, а в самом условии отметить группы, которые этот пункт будут видеть.

Тип условия: Для групп пользователей
Условие: требуемые_группы_пользователей

Отображение пункта меню неавторизованным пользователям

В расширенном режиме редактирования меню необходимо установить следующее условие:

Тип условия: выражение PHP
Условие: !$USER->IsAuthorized()

Отображение пункта меню при нахождении в определенном разделе сайта

Система позволяет отображать пункт меню только при нахождении в указанном разделе сайта или на его страницах. Для этого в расширенном режиме редактирования меню в поле Тип условия необходимо выбрать опцию Для папки и файла, а в поле Условие указать путь.

Примечание: Условие Для папки и файла лучше всего применять для статических страниц и для динамических страниц с компонентами на ЧПУ. На динамических страницах без ЧПУ он не будет работать, так как производит проверку по части адреса, а в динамических страницах всегда будут присутствовать выбранные значения. Для динамических URL удобнее применять условие Параметр в URL.

Отображение определенных пунктов только на главной странице и еще в одном внутреннем разделе

В расширенном режиме в поле условие для нужных пунктов ввести выражение php:

CSite::InDir('/about/') or CSite::InDir('/index.php')

Осуществление вывода пункта меню, ссылающегося на определенный товар, связанный с товаром, открытым на данной странице

Для этого можно использовать тип условия Параметр в URL. Пункт будет отображен на страницах с определенным параметром в URL. Параметр работает с URL, в которых есть символ ?. То есть, с динамическими страницами.

Страницы, созданные на базе инфоблоков, имеют URL вида: http://сайт/раздел/index.php?SECTION_ID=***. Предположим, что на странице с SECTION_ID=123 должен быть отражен пункт меню, ведущий на страницу SECTION_ID=456.

Создадим пункт меню, ведущий на страницу http://сайт/раздел/index.php?SECTION_ID=456. В поле Тип условия выберем Параметр в URL, в первом поле Условие укажем SECTION_ID, а во втором 123.

Всплывающие подсказки для пунктов меню

Для этого необходимо в расширенном режиме редактирования добавить дополнительный параметр A_TITLE, и записать в него содержание всплывающей подсказки.

Название: A_TITLE
Значение: текст_всплывающей_подсказки

В шаблоне меню:

<?if($arItem["SELECTED"]):?>
        <li><a href="<?=$arItem["LINK"]?>" class="selected"><?=$arItem["TEXT"]?></a></li>
    <?else:?>
        <li><a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a></li>
<?endif?>

нужно заменить первую ссылку в коде на строку:

<a href="<?=$arItem["LINK"]?>" class="selected" title="<?=$arItem["PARAMS"]["A_TITLE"]?>"><?=$arItem["TEXT"]?></a>

а вторую на:

<a href="<?=$arItem["LINK"]?>" title="<?=$arItem["PARAMS"]["A_TITLE"]?>"><?=$arItem["TEXT"]?></a>

Как поставить картинки рядом с пунктами меню?

Для этого необходимо добавить в меню дополнительный параметр (редактирование меню в расширенном режиме), например IMG, и записать в него адрес изображения, которое хотите вывести рядом с данным пунктом.

Название: IMG
Значение: путь_к_картинке

В шаблон меню, после вывода элемента меню, необходимо после строки (в зависимости от шаблона):

<a href="<?=$arItem["LINK"]?>">

добавить следующее:

<img src="<?=$arItem["PARAMS"]["IMG"]?>" border="0" />

Разные картинки-пункты меню для разных языков

Меню состоит из пунктов-картинок, заданных CSS классами. Сайт двуязычный. Сама структура меню уже разделена и подключена, необходимо разделить оформление.

Решение:

Укажите в шаблоне меню следующее:

<body class="lang-<?=LANG?>">

в CSS:

.menu li.item1 { 
background-image:url(title-en.gif); 
} 
.lang-ru .menu li.item1 { 
background-image:url(title-ru.gif); 
}

Отображение собственного, не такого как в шаблоне, меню для определенных разделов сайта

Организовать такое меню можно с помощью смены шаблона сайта (Настройки > Настройки продукта > Сайты > Список сайтов, редактирование сайта, секция Шаблон, условие для папки или файла). Причем, если шаблон не сложный, то можно прямо в коде шаблона поставить проверку и в одном случае выводить одно меню в другом - другое:

if($APPLICATION->GetCurPage() == "/index.php") {
вывод меню для главной страницы
}
else {
вывод второго меню
}

Как сделать меню tree в постоянно открытом состоянии?

Решение:

Нужно взять стандартный шаблон меню tree, скопировать его в свой шаблон. После чего в файле template.php необходимо строчку:

<li class="close">

заменить на:

<li>

При этом развернутые пункты будут прятаться по щелчку на изображении.

Как сделать так, чтобы при открытии страницы через древовидное меню, само меню не сворачивалось, а показывало, на какой странице ты находишься?

Решение:

Нужно взять стандартный шаблон меню tree, скопировать его в свой шаблон. После чего в файле template.php необходимо 14 строчку:

<li class="close">

заменить на:

<li <?if (!$arItem["SELECTED"]):?>class="close"<?endif?>>

Примечание: Предложенное решение актуально лишь до 2-го уровня вложенности меню.

Следующий код, который необходимо вставить в файл шаблона, позволяет меню не сворачиваться, при уровне вложенности больше 2:

...
<?if (!empty($arResult)):?>

<?
//анализ открытых узлов дерева
$lastLevel = 0;
$selected = false;

foreach(array_reverse($arResult) as $arItem){
    if ($arItem["SELECTED"]) {
        $lastLevel = $arItem["DEPTH_LEVEL"];
        $selected = true;
    }
    if ($selected and $arItem["DEPTH_LEVEL"] < $lastLevel){
        $arResult[ $arItem["ITEM_INDEX"] ]["SELECTED"] = true;
        $lastLevel--;
    }
}
?>

<div class="menu-sitemap-tree">
<ul>
<?$previousLevel = 0;foreach($arResult as $arItem):?>
...

Скрытие бокового меню по свойству страницы

Задача такая. В шаблоне сайта прописан вывод бокового меню. Нужно, чтобы оно не показывалось только на тех страницах, у которых прописано какое-нибудь свойство, отменяющее показ бокового меню.

Решение:

Если меню расположено в header'е, то функцию GetProperty использовать нельзя, потому что свойства страницы задаются после подключения header'a. Поэтому меню можно вывести "отложенно" следующим способом:

  • в header'е, где надо показать меню добавить следующий код:
$APPLICATION->ShowProperty('menu');
  • в свойствах страницы, если надо запретить меню:
$APPLICATION->SetPageProperty('hide_menu', 'Y');
  • в footer'е:
if( 'Y' != $APPLICATION->GetPageProperty('hide_menu') ){
    ob_start();
    echo 'проверка отложенного меню!';
    // ....здесь происходит вывод меню компонентом или другим способом.... //
    $APPLICATION->SetPageProperty('menu', ob_get_clean() );
}

Само меню "выводится" в футере, если свойство hide_menu не установлено в значение Y. Но оно не выводится на самом деле в футере, а отправляется в свойство menu, которое "выше" по коду можно показать "отложенно" через ShowProperty. Если меню запрещено, то в значении свойства menu будет пусто и ничего не покажется в шаблоне. Если не запрещено, то для этого примера - там, где прописано $APPLICATION->ShowProperty('menu'), будет выведена фраза проверка отложенного меню!.

Меню и кеш

Цитата: Забился весь диск под завязку. Стал разбираться, и оказалось, что папка bitrix/managed_cache/MYSQL/menu весит 16Гб! На сайте присутствуют 2 меню горизонтальное - навигация по страницам сайта и вертикальное - по разделам каталога.

Кеш меню зависит от адреса страницы. Если страниц много, то кеш может получаться большим. В этом случае может оказаться более эффективным отключить кеш в компоненте меню.