Меню
   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 в шаблон
 
Благодарю за статью!
Ответить
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

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

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...

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

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

Кнопка для отправки на печать карточки товара, без лишних данных

Задача: реализовать возможность печати карточки товара, но так что бы в ней не было не нужных данных: шапки и футера сай...

Прятать или показывать описание раздела каталога

В новых компонентах и шаблонах catalog.section есть не документированный и не выводимый параметр: "Скрывать описание раз...

Как вывести картинки к разделам на базе _ext меню

Просто для эстетической красоты, нужно вывести в меню разделов сайта картинки или иконки. Достаточно популярный метод, э...

Адаптивное гамбургер меню для битрикс

Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В архиве готовый шаблон для Битри...

Обновление цен и остатков из текстового файла, в каталоге 1C-Битрикс.

Задача: прочитать txt-файл с ценами и остатками, который выгружает программа учета по FTP, и обновить эти данные в катал...

XML в формате Commerce ML-2, города России и Мира, для выгрузки в инфоблок Битрикс

Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и мира в виде элементов инфобло...

Добавление в избранное или отложенные, на AJAX из карточки товара

В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "Избранное". Для этого будем исп...