Меню с иконками

Задача

У нас есть ссылки такого вида. И нам нужно предоставить пользователю их кастомизировать.

Если выводить это во включаемую область и ЕСЛИ иконка будет SVG тегом, то Битрикс вырежет весь SVG код в целях безопасности.

Предлагаю элегантное решение через компонент меню.


Содержание

  • Создаем меню

  • Выводим компонент

  • Добавляем пункты меню

  • Правим шаблон компонента

Создаем меню

В админ. панели: Настройки модулей → Управление структурой

Выводим компонент

// Ссылки
<? $APPLICATION->IncludeComponent(
    "bitrix:menu",
    "toplinks", // Используем один шаблон
    [
        "ALLOW_MULTI_SELECT" => "N",
        "CHILD_MENU_TYPE" => "section",
        "DELAY" => "N",
        "MAX_LEVEL" => "1",
        "MENU_CACHE_GET_VARS" => [""],
        "MENU_CACHE_TIME" => "3600",
        "MENU_CACHE_TYPE" => "N",
        "MENU_CACHE_USE_GROUPS" => "Y",
        "ROOT_MENU_TYPE" => "toplinks", // Код меню, которое мы создали выше
        "USE_EXT" => "N",
        // Custom.
        "CONTAINER_CLASS" => "top-bar__links" // У нас по верстке отличается только класс контейнера
    ]
); ?>
// Социальные сети
<? $APPLICATION->IncludeComponent(
    "bitrix:menu",
    "toplinks",  // Используем один шаблон
    [
        "ALLOW_MULTI_SELECT" => "N",
        "CHILD_MENU_TYPE" => "section",
        "DELAY" => "N",
        "MAX_LEVEL" => "1",
        "MENU_CACHE_GET_VARS" => [""],
        "MENU_CACHE_TIME" => "3600",
        "MENU_CACHE_TYPE" => "N",
        "MENU_CACHE_USE_GROUPS" => "Y",
        "ROOT_MENU_TYPE" => "topsocials", // Код меню, которое мы создали выше
        "USE_EXT" => "N",
        // Custom.
        "CONTAINER_CLASS" => "top-bar__social" // У нас по верстке отличается только класс контейнера
    ]
); ?>

Непосредственно меню

<?
// .toplinks.menu.php
$aMenuLinks = [
    [
        "Как сделать заказ",
        "/",
        [],
        ["ICON_LINK" => SITE_TEMPLATE_PATH . "/assets/img/order.svg"], // В параметры добавляем путь к иконке.
        "",
    ],
    [
        "Скачать каталог",
        "/documents/catalog.pdf",
        [],
        ["ICON_LINK" => SITE_TEMPLATE_PATH . "/assets/img/catalog.svg"],
        "",
    ],
    [
        "zakaz@sbk-g.com",
        "zakaz@sbk-g.com",
        [],
        ["ICON_LINK" => SITE_TEMPLATE_PATH . "/assets/img/mail.svg"],
        "",
    ],
];
<?
// .topsocials.menu.php
$aMenuLinks = [
    [
        "", // Оставляем пустым т.к. нам нужна только иконка
        "/",
        [],
        ["ICON_LINK" => SITE_TEMPLATE_PATH . "/assets/img/social/tg.svg"],
        "",
    ],
    [
        "",
        "/documents/catalog.pdf",
        [],
        ["ICON_LINK" => SITE_TEMPLATE_PATH . "/assets/img/social/wa.svg"],
        "",
    ],
];

Шаблон компонента

<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
    die();
}
/**
 * @var $arParams
 */
?>
<? if (!empty($arResult)) { ?>
    <div class="<?= $arParams['CONTAINER_CLASS'] ?>"> // Наш класс из параметров.
        <?
        foreach ($arResult as $arItem) {
            if ($arParams["MAX_LEVEL"] === 1 && $arItem["DEPTH_LEVEL"] > 1) {
                continue;
            }
            if (strpos($arItem["LINK"], '@')) { // Проверяем если почта, то в ссылку добавим mailto:
                if ($arItem["LINK"][0] === '/') { // по умолчанию прилетает ссылка с '/' в начале. Для почты вырежем это.
                    $arItem["LINK"] = substr($arItem["LINK"], 1);
                }
                $arItem["LINK"] = 'mailto:' . $arItem["LINK"];
            }
            ?>
            <a href="<?=$arItem["LINK"]?>">
                <img src="<?=$arItem['PARAMS']['ICON_LINK']?>" alt="">
                <? if($arItem["TEXT"]) {?>
                    <span><?=$arItem["TEXT"]?></span>
                <? } ?>
            </a>
        <? } ?>
    </div>
<? } ?>

РЕЗУЛЬТАТ

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

И в расширенном режиме из админ. панели