Создаем меню из разделов инфоблока.
Штатный способ создания меню из разделов инфоблока основан на подключении к меню файла вида .тип_меню.ext.php (у меня он называется .catalog.menu_ext.php), который должен содержать примерно такой код (ID и типы инфоблоков указывайте свои):
| Код |
|---|
<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
$aMenuLinksExt = $APPLICATION->IncludeComponent(
"bitrix:menu.sections",
"",
Array(
"IS_SEF" => "Y",
"SEF_BASE_URL" => SITE_DIR."catalog/",
"SECTION_PAGE_URL" => "#SECTION_CODE#/",
"DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE#",
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "3",
"DEPTH_LEVEL" => "4",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000",
"PATH" => rtrim(str_replace(SITE_DIR . 'catalog/', '', $APPLICATION->GetCurDir()), '/')
),
false
);
$aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);
?> |
Шаг 1. Прикрепляем картинки к разделам инфоблока.Шаг 2. Кастомизируем компонент menu.sections
Переносим компонент
menu.sections в собственное пространство имен. Например, в папке
/bitrix/components/ рядом с папкой
bitrix создаем свою - под названием
custom. Это и будет новое пространство имен, в котором можно размещать собственные и кастомизированные компоненты. В эту папку custom пока просто копируем всю папку компонента
menu.sections из
/bitrix/components/.
Открываем файл
/bitrix/components/custom/menu.sections/component.php, и вносим следующие изменения:
1. добавляем ключ PICTURE в 4 параметр функции
| Код |
|---|
<?php
$rsSections = CIBlockSection::GetList($arOrder, $arFilter, false, array(
"ID",
"DEPTH_LEVEL",
"NAME",
"PICTURE",
"SECTION_PAGE_URL",
)); |
1.1. Находим, где формируется $arResult["SECTIONS"], добавляем ключ PICTURE в $arResult["SECTIONS"]
| Код |
|---|
$aMenuLinksNew[$menuIndex++] = array(
htmlspecialcharsbx($arSection["~NAME"]),
$arSection["~SECTION_PAGE_URL"],
$arResult["ELEMENT_LINKS"][$arSection["ID"]],
array(
"FROM_IBLOCK" => true,
"PICTURE" => $arSection["PICTURE"],
"IS_PARENT" => false,
"DEPTH_LEVEL" => $arSection["DEPTH_LEVEL"]
)
); |
2. добавляем ключ PICTURE в результирующий массив
| Код |
|---|
$aMenuLinksNew[$menuIndex++] = array(
htmlspecialcharsbx($arSection["~NAME"]),
$arSection["~SECTION_PAGE_URL"],
$arResult["ELEMENT_LINKS"][$arSection["ID"]],
array(
"FROM_IBLOCK" => true,
"PICTURE" => $arSection["PICTURE"],
"IS_PARENT" => false,
"DEPTH_LEVEL" => $arSection["DEPTH_LEVEL"]
)
); |
Шаг 3. Масштабируем картинку раздела и показываем в менюОткрываем опять наш файл .catalog.menu_ext.php. Переписываем ...IncludeComponent("bitrix:menu.sections"... на ...IncludeComponent("custom:menu.sections"...
Все готово, давайте уже покажем картинку раздела в нашем меню. Открываем файл шаблона компонента menu.
Находим место, где открывается цикл foreach($arResult as $arItem)
В теле цикла первой же строчкой объявляем строковую переменную $strImg, и при наличии в массиве $arItem["PARAMS"] непустого ключа PICTURE получаем массив с картинкой по методу CFile::ResizeImageGet
Обратите внимание на 2 важных момента! Первое - в проверку на существование картинки в параметре также добавлена проверка на уровень вложенности: $arItem["DEPTH_LEVEL"]==1, что означает, что вывод картинки будет применен только к пунктам ВЕРХНЕГО УРОВНЯ.
Второй момент - масштабирование картинки методом CFile::ResizeImageGet - параметр array('width'=>30, 'height'=>30) задает РАЗМЕРЫ картинки в пикселях. Подставляйте свои размеры по дизайну.При выводе ссылки добавляем $strImg в нужное место
| Код |
|---|
$strImg = '';
if(intval($arItem["PARAMS"]["PICTURE"])>0 && $arItem["DEPTH_LEVEL"]==1){
$img = CFile::ResizeImageGet($arItem["PARAMS"]["PICTURE"], array('width'=>30, 'height'=>30),
BX_RESIZE_IMAGE_PROPORTIONAL, false);
$strImg = '<img alt="" src="'.$img['src'].'" />';
} |
Все готово.