30  /  382
Справочник

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

Просмотров: 68504
Дата последнего изменения: 02.11.2023
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет
  • Подсветка ссылок
  • Как сделать, чтобы отдельный пункт меню открывался в новом окне?
  • Отображение пункта меню для определенных групп пользователей
  • Отображение пункта меню неавторизованным пользователям
  • Отображение пункта меню при нахождении в определенном разделе сайта
  • Отображение определенных пунктов только на главной странице и еще в одном внутреннем разделе
  • Осуществление вывода пункта меню, ссылающегося на определенный товар, связанный с товаром, открытым на данной странице
  • Всплывающие подсказки для пунктов меню
  • Как поставить картинки рядом с пунктами меню?
  • Разные картинки-пункты меню для разных языков
  • Отображение собственного, не такого как в шаблоне, меню для определенных разделов сайта
  • Как сделать меню tree в постоянно открытом состоянии?
  • Как сделать так, чтобы при открытии страницы через древовидное меню, само меню не сворачивалось, а показывало, на какой странице ты находишься?
  • Скрытие бокового меню по свойству страницы
  • Меню и кеш

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

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

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


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

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

    Название: 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 меню горизонтальное - навигация по страницам сайта и вертикальное - по разделам каталога.

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

    40
    Курсы разработаны в компании «1С-Битрикс»

    Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
    Развернуть комментарии