Меню
   RSS
Пункты меню из разделов инфоблока Битрикс
 
Пункты меню из разделов инфоблока Битрикс

В принципе это стандартная возможность системы управления битрикс, но почему-то часто спрашивают как это сделать. Возможно в документации данный вопрос освещен не достаточно понятно. Постараюсь рассказать по простому, со скринами.
Ответить
Ответы
 
Михаил подскажите а как добавить произвольную свою ссылку в выпадающем меню с разделами из каталога
 
Цитата
olegrus написал:
Михаил подскажите а как добавить произвольную свою ссылку в выпадающем меню с разделами из каталога
Просто добавить в меню, там массив собирается:
$aMenuLinksExt - массив с разделами
$aMenuLinks - массив с произвольными пунктами меню
Код
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
 
Здравствуйте, стоит задача  натянуть верстку. Нужно из компонента catalog.section.list, но проблема в том что, там всего 2 уровня и верстка без классов. А у меня прям сложная верстка и в этот компонент он не войдет. Возможно есть какие готовые нароботки для этих дел?

Верстку прикладываю (все верстку крепить не стал, но вид ее такой, лишние пункт удалил).
Код
<div class="catalog-menu catalog__menu">
   <ul class="catalog-menu__list">
      <li class="catalog-menu__item"> <?// 1 уровень?>
         <a class="catalog-menu__link is-dropdown" href="#">
            <img class="catalog-menu__img" src="assets/img/general/catalog/1.png" alt=""><span>Автомасла</span>
         </a>
         <div class="catalog-menu__drop">
            <div class="catalog-menu__drop-grid">
               <div class="catalog-menu__drop-col">
                  <ul class="catalog-menu__drop-list">
                     <li class="catalog-menu__drop-item"><?// 2 уровень?>
                        <a class="catalog-menu__drop-link" href="#">
                           Масла Mobil
                        </a>
                        <div class="catalog-menu__drop-col">
                           <ul class="catalog-menu__drop-list">
                              <li class="catalog-menu__drop-item"> <?// 3 уровень?>
                                 <a class="catalog-menu__drop-link" href="#">Масла Mobil</a>
                              </li>
                           </ul>
                        </div>
                     </li>
                  </ul>
               </div>
            </div>
         </div>
      </li>
      <li class="catalog-menu__item"><?// 1 уровень?>
         <a class="catalog-menu__link" href="#">
            <img class="catalog-menu__img" src="assets/img/general/catalog/2.png" alt=""><span>Животноводческое оборудование</span>
         </a>
      </li>
   </ul>
</div>
 
Цитата
Гость написал:
Здравствуйте, стоит задача  натянуть верстку. Нужно из компонента catalog.section.list, но проблема в том что, там всего 2 уровня и верстка без классов. А у меня прям сложная верстка и в этот компонент он не войдет. Возможно есть какие готовые нароботки для этих дел?

Глубину уровня вложенности можно задать через параметр "TOP_DEPTH"
Внутри, что бы натянуть верстку, можно использовать условие
Код
<?if ($arSection['DEPTH_LEVEL'] == '2') {?>
Верстка второго уровня
<?}?>

<?if ($arSection['DEPTH_LEVEL'] == '3') {?>
Верстка третьего уровня
<?}?>
Изменено: Михаил Базаров - 04.10.2022 13:56:40
 
Цитата
написал:
Цитата
Гость написал:
Здравствуйте, стоит задача  натянуть верстку. Нужно из компонента catalog.section.list, но проблема в том что, там всего 2 уровня и верстка без классов. А у меня прям сложная верстка и в этот компонент он не войдет. Возможно есть какие готовые нароботки для этих дел?
Глубину уровня вложенности можно задать через параметр "TOP_DEPTH"
Внутри, что бы натянуть верстку, можно использовать условие
Код
 <?if ($arSection['DEPTH_LEVEL'] == '2') {?>
Верстка второго уровня
<?}?>
<?if ($arSection['DEPTH_LEVEL'] == '3') {?>
Верстка третьего уровня
<?}?>
 
Спасибо, Михаил. Рад, что ответили.
Изменено: Михаил Базаров - 22.05.2023 08:15:49
 
Добрый день, подскажите пожалуйста, можно ли в меню вывести не разделы каталога, а характеристику товара причем множественную(один и тот же товар(запчасть) может подходить к разным моделям). И чтобы при ее выборе открывалась вторая характеристика , например имеющиеся размеры.  
 
Цитата
Гость написал:
Добрый день, подскажите пожалуйста, можно ли в меню вывести не разделы каталога, а характеристику товара причем множественную(один и тот же товар(запчасть) может подходить к разным моделям). И чтобы при ее выборе открывалась вторая характеристика , например имеющиеся размеры.  

В целом можно, но нужно будет модифицировать компонент через result_modifier.php
 
Цитата
написал:
Цитата
Гость написал:
Добрый день, подскажите пожалуйста, можно ли в меню вывести не разделы каталога, а характеристику товара причем множественную(один и тот же товар(запчасть) может подходить к разным моделям). И чтобы при ее выборе открывалась вторая характеристика , например имеющиеся размеры.  
В целом можно, но нужно будет модифицировать компонент через result_modifier.php
Спасибо за направление! Поковыряю его!
Изменено: Михаил Базаров - 08.12.2022 14:52:51
 
Месяц знакомлюсь с битриксом. Сделал вывод: если есть возможность, то лучше не использовать эту "технологию". С меню мучаюсь уже неделю. Не могу сделать меню из разделов и элементов раздела. Если бы я использовал реакт или даже нативный php, то сделал бы это меню за несколько часов. Здесь же я мучаюсь. Такой тупей шей реализации еще не встречал!  
 
Цитата
Alex написал:
Месяц знакомлюсь с битриксом. Сделал вывод: если есть возможность, то лучше не использовать эту "технологию". С меню мучаюсь уже неделю. Не могу сделать меню из разделов и элементов раздела. Если бы я использовал реакт или даже нативный php, то сделал бы это меню за несколько часов. Здесь же я мучаюсь. Такой тупей шей реализации еще не встречал!  

Да, для такого лучше использовать catalog.section.list - элементы можно добавить в массив, для вывода меню, через result_modifier.php
Если есть время, совсем хорошо сделать свой компонент, что бы лишнее не тянуть.
Изменено: Михаил Базаров - 22.05.2023 10:42:08
 
Михаил, А как сделать для лэндинга активными пункты меню с # и в пределах одной страницы?
 
Так вот не смогу дать готовый код, но думаю только с помощью js
Проверять какой блок находится в зоне видимости и по id пункта меню добавлять ему нужный class
То есть, грубо говоря, если блок с id="block1" сейчас по offset 0 от верха страницы, то добавить class="selected" для пункта меню с id="link_to_block1"
 
Спасибо за ответ, Михаил ! Так и думал, что функционалом битрикса это не решить ...
 
Здравствуйте. Подскажите, данный метод еще актуален? Не получается добавить ни элементы, ни разделы в меню - ничего не происходит. Спасибо
 
Для меня сработал этот код:
Код
<? if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
if(CModule::IncludeModule('iblock')) {
   $IBLOCK_ID = 7; // ID инфоблока из которого берем элементы
   $arOrder = Array('NAME'=>'ASC'); // Выбрать сортировку
   $arSelect = Array('ID', 'NAME', 'IBLOCK_ID', 'DETAIL_PAGE_URL');
   $arFilter = Array('IBLOCK_ID'=>$IBLOCK_ID, 'ACTIVE'=>'Y', 'PROPERTY_razdel'=> $_REQUEST['SECTION_ID']);
   $res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);
   while($ob = $res->GetNextElement()) {
      $arFields = $ob->GetFields();
      $aMenuLinksExt[] = Array(
         $arFields['NAME'],
         $arFields['DETAIL_PAGE_URL'],
         Array(),
         Array(),
         ''
      );
   }
}
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
?>

Если честно, впервые столкнулся с Битрикс и .php
Михаил, не могли бы вы объяснить разницу между Вашим решением и вышеприведённым? Спасибо
* При внедрении Вашего решения неоднократно чистил кэш как в настройках Битрикс, так и через админпанель
Изменено: Михаил Базаров - 24.11.2023 10:51:11
 
А возможно вывести картинку для анонса или детальное изображение (не  важно) из каталога рядом с названием пункта меню? К примеру, чтобы слева  от текста располагалось изображение?

Попробовал поменять код файла .тип_меню.menu_ext.php:
Код
<? if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();global $APPLICATION;
if (CModule::IncludeModule('iblock')) {
    $IBLOCK_ID = 11; // ID инфоблока из которого берем элементы
    $arOrder = Array('NAME' => 'ASC'); // Выбрать сортировку
    $arSelect = Array('ID', 'NAME', 'IBLOCK_ID', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE'); // Включить PREVIEW_PICTURE в выборку
    $arFilter = Array('IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', 'PROPERTY_razdel' => $_REQUEST['SECTION_ID']);
    $res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);
    while ($ob = $res->GetNextElement()) {
        $arFields = $ob->GetFields();
        $imageSrc = !empty($arFields['PREVIEW_PICTURE']) ? CFile::GetPath($arFields['PREVIEW_PICTURE']) : ''; // Получаем путь к изображению
        $aMenuLinksExt[] = Array(
            $arFields['NAME'],
            $arFields['DETAIL_PAGE_URL'],
            Array(),
            Array(),
            '',
            'PARAMS' => array(
                'IMG_SRC' => $imageSrc, // Передаем путь к изображению в параметрах
            ),
        );
    }
}
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);
?>

Код шаблона меню:

Код
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>

<? if (!empty($arResult)): ?>
<ul id="horizontal-multilevel-menu">
    <?
    $previousLevel = 0;
    foreach ($arResult as $arItem):
    $imageSrc = !empty($arItem['PREVIEW_PICTURE']) ? CFile::GetPath($arItem['PREVIEW_PICTURE']) : ''; // Получаем путь к изображению

    if ($previousLevel && $arItem["DEPTH_LEVEL"] < $previousLevel) {
        echo str_repeat("</ul></li>", ($previousLevel - $arItem["DEPTH_LEVEL"]));
    }

    if ($arItem["IS_PARENT"]) {
    if ($arItem["DEPTH_LEVEL"] == 1) {
    ?>
    <li>
        <?php if (!empty($imageSrc)): ?>
            <img src="<?= $imageSrc ?>" alt="<?= $arItem["TEXT"] ?>" class="menu-item-image">
        <?php endif; ?>
        <a href="<?= $arItem["LINK"] ?>" class="<?= $arItem["SELECTED"] ? 'root-item-selected' : 'root-item' ?>">
            <?= $arItem["TEXT"] ?>
        </a>
        <ul>
            <?php
            } else {
            ?>
            <li<?= $arItem["SELECTED"] ? ' class="item-selected"' : '' ?>>
                <a href="<?= $arItem["LINK"] ?>" class="parent"><?= $arItem["TEXT"] ?></a>
                <ul>
                    <?php
                    }
                    } else {
                        if ($arItem["PERMISSION"] > "D") {
                            if ($arItem["DEPTH_LEVEL"] == 1) {
                                ?>
                                <li>
                                    <?php if (!empty($imageSrc)): ?>
                                        <img src="<?= $imageSrc ?>" alt="<?= $arItem["TEXT"] ?>" class="menu-item-image">
                                    <?php endif; ?>
                                    <a href="<?= $arItem["LINK"] ?>"
                                       class="<?= $arItem["SELECTED"] ? 'root-item-selected' : 'root-item' ?>">
                                        <?= $arItem["TEXT"] ?>
                                    </a>
                                </li>
                                <?php
                            } else {
                                ?>
                                <li<?= $arItem["SELECTED"] ? ' class="item-selected"' : '' ?>>
                                    <a href="<?= $arItem["LINK"] ?>"><?= $arItem["TEXT"] ?></a>
                                </li>
                                <?php
                            }
                        } else {
                            if ($arItem["DEPTH_LEVEL"] == 1) {
                                ?>
                                <li>
                                    <a href=""
                                       class="<?= $arItem["SELECTED"] ? 'root-item-selected' : 'root-item' ?>"
                                       title="<?= GetMessage("MENU_ITEM_ACCESS_DENIED") ?>">
                                        <?= $arItem["TEXT"] ?>
                                    </a>
                                </li>
                                <?php
                            } else {
                                ?>
                                <li>
                                    <a href="" class="denied"
                                       title="<?= GetMessage("MENU_ITEM_ACCESS_DENIED") ?>"><?= $arItem["TEXT"] ?></a>
                                </li>
                                <?php
                            }
                        }
                    }

                    $previousLevel = $arItem["DEPTH_LEVEL"];
                    endforeach;

                    if ($previousLevel > 1) {
                        echo str_repeat("</ul></li>", ($previousLevel - 1));
                    }
                    ?>

                </ul>
                <div class="menu-clear-left"></div>
                <? endif ?>
В итоге ничего не меняется. Визуально все остается таким же, код работает. 
Если просто добавить 
[/COLOR][/FONT][/COLOR][CODE]$arFields['PREVIEW_PICTURE'],            
$arFields ['DETAIL_PICTURE'],

в массив $aMenuLinksExt, то меню ломается, вылезает ошибка.

Подскажите, что я делаю не так? Опыт битрикс и php нулевой, извините за тупость

Изменено: Михаил Базаров - 24.11.2023 10:54:51
 
Способ точно рабочий, но в вашем случае, раз уж все равно выводите и разделы и элементы (так понял из сообщений) проще воспользоваться компонентом catalog.section.list - он умеет выводить все данные разделов включя картинки.
А дополучить внутри них элементы уже дело техники - там не сложно.
 
Добрый день,
как сделать для нескольких инфоблоков?
 
Цитата
Гость написал:
Добрый день,
как сделать для нескольких инфоблоков?

Нужно будет кастомизировать компонент  bitrix:menu.sections
Но лучше написать свой, который параметрами будет принимать нужны инфоблоки и собирать массив arResult в шаблон
 
Благодарю за статью!
 
Михаил здравствуйте. На странице новостей, в разделах новостей, в элементах - меню выводиться. А вот на главной почему то не получается вывести
Код
 <?$APPLICATION->IncludeComponent(
   "bitrix:menu",
   "info_menu",
   Array(
      "ALLOW_MULTI_SELECT" => "N",
      "CHILD_MENU_TYPE" => "podrazdel",
      "COMPONENT_TEMPLATE" => "info_menu",
      "DELAY" => "N",
      "MAX_LEVEL" => "1",
      "MENU_CACHE_GET_VARS" => array(),
      "MENU_CACHE_TIME" => "3600",
      "MENU_CACHE_TYPE" => "N",
      "MENU_CACHE_USE_GROUPS" => "Y",
      "ROOT_MENU_TYPE" => "podrazdel",
      "USE_EXT" => "Y"
   )
);?>
Ответить
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Блог-note: заметки разработчика

CRM Битрикс-24 на веб-окружении под Ubuntu 24.04, c поддержкой PUSH и многосайтовости

Задача: Так как с 30 июня 2024 года операционная система CentOS-7 полностью снята с поддержки и не будет получать обновл...

Правильное подключение стилей и скриптов в Битрикс

Есть несколько способов подключения файлов стилей и скриптов, при верстке шаблонов в системе управления 1С-Битрикс. Если...

Показать пользователей онлайн на странице сайта

Задача: показать на странице сайта пользователей которые сейчас находятся на сайте. Используется штатный модуль "Ве...

Как вывести свойства инфоблока по отдельности и немного плюшек не в тему

Если у инфоблока несколько свойств- то при выводе их всех, скажем в детальном описании новости, они выводятся все вместе...

Сортировать товары по названию, цене и свойствам в каталоге 1С-Битрикс

Задача: реализовать возможность сортировки товаров в разделах каталога. Сортировка должна работать с использованием AJAX...

Определить местоположение пользователя и показать на карте

Задача определить местоположение текущего пользователя и показать его на карте, с меткой. Сделать можно с помощью класса...

Заменить popap "Товар добавлен в корзину" на собственное окно

Задача: заменить модальное окно, которое появляется при добавлении товара в корзину — "Товар добавлен в корзину&quo...

Не дать пользователю купить больше одного товара, в Битрикс

Иногда нужно и такое: Например: на одном из разрабатываемых сайтов, мне нужно было создать всего 4 товара. при этом поку...

Как выводить пользовательские поля и названия разделов инфоблока в Битриксе

Если вам необходимо вывести дополнительное пользовательское поле типа "Привязка к разделам инфоблока", эта записка может...