Иногда в меню сайта на 1С-Битрикс нужно открыть не все ссылки, а только один конкретный пункт в новой вкладке. Например, если пункт меню ведет на PDF-файл: согласие на обработку персональных данных, политику конфиденциальности, согласие на использование cookies или другой документ.
На первый взгляд кажется, что достаточно добавить параметр target="_blank" прямо в файл меню. Но на практике это может не сработать, если шаблон меню не выводит дополнительные параметры пункта.
Пример задачи
Допустим, в файле меню есть такой пункт:
Array(
"Cогласие на использование файлов cookies",
"/organization/Cookie_AK.pdf",
Array(),
Array(),
""
),Нужно сделать так, чтобы именно эта ссылка открывалась в новой вкладке.
Как устроен пункт меню в Битрикс
Обычный пункт меню в файле .menu.php состоит из пяти элементов:
- название пункта меню;
- ссылка;
- массив дополнительных ссылок для подсветки активного пункта;
- массив дополнительных параметров;
- условие показа пункта меню.
Нас интересует четвертый элемент массива. Именно туда можно передать свой параметр для шаблона меню.
Добавляем target в .menu.php
В файле меню нужно добавить параметр target в четвертый массив:
Array(
"Cогласие на использование файлов cookies",
"/organization/Cookie_AK.pdf",
Array(),
Array("target" => "_blank"),
""
),Можно использовать и одинарные кавычки:
Array(
'Cогласие на использование файлов cookies',
'/organization/Cookie_AK.pdf',
Array(),
Array('target' => '_blank'),
''
),Для PHP разницы между этими вариантами в данном случае нет. Если ссылка после этого не открывается в новой вкладке, причина не в кавычках.
Почему target может не работать
Самая частая причина — шаблон меню просто не выводит этот параметр в HTML.
То есть в файле .menu.php параметр уже есть:
Array("target" => "_blank")Но в шаблоне меню ссылка по-прежнему выводится примерно так:
<a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>
В этом коде нет обращения к $arItem["PARAMS"]["target"], поэтому Битрикс не добавляет target="_blank" автоматически.
Как исправить шаблон меню
Нужно найти шаблон компонента меню. Обычно он находится примерно по такому пути:
/bitrix/templates/ваш_шаблон/components/bitrix/menu/название_шаблона/template.phpВ шаблоне нужно найти вывод ссылки. Например:
<a class="sidebar-menu__link<?=($arItem["SELECTED"] ? " active" : "")?>" href="<?=$arItem["LINK"]?>">
<?=$arItem["TEXT"]?>
</a>
И заменить его на вариант с проверкой параметра target:
<a class="sidebar-menu__link<?=($arItem["SELECTED"] ? " active" : "")?>"
href="<?=$arItem["LINK"]?>"
<?if(!empty($arItem["PARAMS"]["target"])):?>
target="<?=$arItem["PARAMS"]["target"]?>" rel="noopener noreferrer"
<?endif;?>
>
<?=$arItem["TEXT"]?>
</a>Если в меню есть подпункты
Если шаблон меню выводит не только основные пункты, но и подпункты, то обработку target нужно добавить и для них.
Например, ссылка подпункта может выглядеть так:
<a class="sidebar-menu__dop_link<?=($arSubItem["SELECTED"] ? " active" : "")?>" href="<?=$arSubItem["LINK"]?>">
<?=$arSubItem["TEXT"]?>
</a>Ее можно заменить на такой вариант:
<a class="sidebar-menu__dop_link<?=($arSubItem["SELECTED"] ? " active" : "")?>"
href="<?=$arSubItem["LINK"]?>"
<?if(!empty($arSubItem["PARAMS"]["target"])):?>
target="<?=$arSubItem["PARAMS"]["target"]?>" rel="noopener noreferrer"
<?endif;?>
>
<?=$arSubItem["TEXT"]?>
</a>Пример для конкретного шаблона меню
Допустим, в шаблоне есть такой код для основного пункта меню:
<a class="sidebar-menu__link<?=($arItem["SELECTED"] ? " active" : "")?>" href="<?=$arItem["LINK"]?>">
<?=(isset($arItem["PARAMS"]["BLOCK"]) && $arItem["PARAMS"]["BLOCK"] ? $arItem["PARAMS"]["BLOCK"] : "");?><?=$arItem["TEXT"]?>
</a>Тогда его можно заменить на такой:
<a class="sidebar-menu__link<?=($arItem["SELECTED"] ? " active" : "")?>"
href="<?=$arItem["LINK"]?>"
<?if(!empty($arItem["PARAMS"]["target"])):?>
target="<?=$arItem["PARAMS"]["target"]?>" rel="noopener noreferrer"
<?endif;?>
>
<?=(isset($arItem["PARAMS"]["BLOCK"]) && $arItem["PARAMS"]["BLOCK"] ? $arItem["PARAMS"]["BLOCK"] : "");?><?=$arItem["TEXT"]?>
</a>А если в этом же шаблоне есть подпункты меню:
<a class="sidebar-menu__dop_link<?=($arSubItem["SELECTED"] ? " active" : "")?>" href="<?=$arSubItem["LINK"]?>">
<?=$arSubItem["TEXT"]?>
</a>Их также нужно заменить:
<a class="sidebar-menu__dop_link<?=($arSubItem["SELECTED"] ? " active" : "")?>"
href="<?=$arSubItem["LINK"]?>"
<?if(!empty($arSubItem["PARAMS"]["target"])):?>
target="<?=$arSubItem["PARAMS"]["target"]?>" rel="noopener noreferrer"
<?endif;?>
>
<?=$arSubItem["TEXT"]?>
</a>Полный пример пункта меню
После доработки шаблона меню пункт в файле .menu.php может выглядеть так:
Array(
"Cогласие на использование файлов cookies",
"/organization/Cookie_AK.pdf",
Array(),
Array("target" => "_blank"),
""
),Теперь при выводе меню ссылка получит дополнительный атрибут:
<a href="/organization/Cookie_AK.pdf" target="_blank" rel="noopener noreferrer">
Cогласие на использование файлов cookies
</a>Зачем добавлять rel="noopener noreferrer"
Если ссылка открывается в новой вкладке через target="_blank", рекомендуется дополнительно добавлять атрибут rel="noopener noreferrer".
Это делается для безопасности и защиты исходной страницы от возможного воздействия со стороны страницы, открытой в новой вкладке.
Как проверить, приходит ли параметр в шаблон
Если после правок ссылка все равно не открывается в новой вкладке, можно временно вывести параметры пункта меню прямо в шаблоне:
<pre><?print_r($arItem["PARAMS"]);?></pre>Если все настроено правильно, вы увидите примерно такой массив:
Array
(
[target] => _blank
)Если параметр в массиве есть, значит проблема была именно в HTML-выводе ссылки. Если параметра нет, нужно проверить сам файл меню, кеширование и то, тот ли шаблон меню используется на странице.
Не забудьте очистить кеш
Меню в Битрикс часто кешируется. Поэтому после изменения файла .menu.php или шаблона меню нужно очистить кеш сайта.
Если кеш не сбросить, можно долго проверять правильный код и думать, что он не работает, хотя на сайте просто отображается старая версия меню.
Чтобы открыть конкретный пункт меню Битрикс в новой вкладке, недостаточно просто добавить target в файл .menu.php. Нужно убедиться, что шаблон меню выводит этот параметр в HTML-ссылку.
Правильная схема такая:
- в файле меню добавить
Array("target" => "_blank")в четвертый параметр пункта; - в шаблоне меню проверить
$arItem["PARAMS"]["target"]; - если параметр есть, вывести
target="_blank"; - добавить
rel="noopener noreferrer"для безопасности; - очистить кеш Битрикс.
После этого выбранный пункт меню будет открываться в новой вкладке, а остальные ссылки меню продолжат работать как раньше.



