1. Главная
  2. Блог
  3. 1С-Битрикс
  4. У каталога 2 инфоблока, как элементы одного вывести в разделе другого?

У каталога 2 инфоблока, как элементы одного вывести в разделе другого?

При разработке интернет-магазинов на 1С-Битрикс нередко возникает задача: вывести в разделе каталога не только товары текущего инфоблока, но и элементы другого инфоблока — например, услуги, товары «на аренду» или сопутствующие позиции.

В этой статье разберём практическое решение на примере шаблона АСПРО Максимум, которое корректно работает:

  • когда в разделе есть товары;
  • когда раздел полностью пуст;
  • без вмешательства в ядро 1С-Битрикс;
  • с управлением через настройки раздела.

Исходные данные

В проекте используются два инфоблока:

  • Инфоблок «Продажа» — основной каталог товаров;
  • Инфоблок «Аренда» — отдельный каталог арендных товаров.

Задача — в нужных разделах инфоблока «Продажа» выводить выбранные элементы из инфоблока «Аренда»:

  • под основным списком товаров, если товары есть;
  • вместо сообщения «Раздел пуст», если товаров нет.

Общая логика решения

  1. В разделе инфоблока «Продажа» создаётся пользовательское поле с привязкой к элементам инфоблока «Аренда».
  2. В шаблоне Aspro Max определяется, выбраны ли арендные товары.
  3. Если выбраны — выводится дополнительный блок с использованием стандартного шаблона каталога.
  4. Блок показывается как в пустом, так и в непустом разделе.

Важно: в нашем случае сообщение «Раздел пуст» формируется не в шаблоне catalog.section, а в родительском файле list_elements_1.php. Поэтому вся логика должна находиться именно там.


Шаг 1. Создание пользовательского поля у раздела

В административной части Битрикс:

В настройках раздела создаём дополнительное поле:

  • Код поля: UF_RENT_ITEMS
  • Тип: Привязка к элементам инфоблоков
  • Инфоблок: «Аренда»
  • Множественное: Да

Теперь для каждого раздела можно выбрать любые арендные товары.
дополнительное поле у раздела 1С-Битрикс


Шаг 2. Где вносить изменения

Основной файл для правок:

/bitrix/templates/aspro_max/components/bitrix/catalog/main/page_blocks/list_elements_1.php

Именно здесь решение:

  • подсчитывает количество товаров в разделе;
  • решает, выводить товары или сообщение «Раздел пуст»;
  • формирует структуру страницы.

Шаг 3. Код определения и вывода арендных товаров

Ниже приведён итоговый код. В нем необходимо указать ID инфоблока из которого выводить элементы.

<?php
$rentIblockId = 47; // ID инфоблока "Аренда"
$ufCode = 'UF_RENT_ITEMS';
$rentIds = [];
$bHasRent = false;

// Функция вывода блока аренды
$__renderRentBlock = function() use (&$rentIds, $rentIblockId, $arParams, $component, $APPLICATION) {
    if (empty($rentIds)) {
        return;
    }

    $GLOBALS['asproRentFilter'] = ['=ID' => $rentIds];

    echo '<div class="rent-products-block">';
    echo '<div class="main-title">Можно арендовать</div>';

    $arRentParams = $arParams;
    $arRentParams['IBLOCK_ID'] = $rentIblockId;
    $arRentParams['IBLOCK_ID_PARENT'] = $rentIblockId;
    $arRentParams['FILTER_NAME'] = 'asproRentFilter';

    $arRentParams['SECTION_ID'] = '';
    $arRentParams['SECTION_CODE'] = '';
    $arRentParams['SECTION_CODE_PATH'] = '';
    $arRentParams['INCLUDE_SUBSECTIONS'] = 'Y';

    $arRentParams['PAGE_ELEMENT_COUNT'] = (string)count($rentIds);
    $arRentParams['CACHE_FILTER'] = 'Y';
    $arRentParams['SET_TITLE'] = 'N';
    $arRentParams['SET_STATUS_404'] = 'N';
    $arRentParams['SEF_FOLDER'] = '';
    $arRentParams['USE_FILTER'] = 'N';
    $arRentParams['SET_LAST_MODIFIED'] = 'N';

    $rentDetailUrl = (string)CIBlock::GetArrayByID($rentIblockId, 'DETAIL_PAGE_URL');
    $rentSectionUrl = (string)CIBlock::GetArrayByID($rentIblockId, 'SECTION_PAGE_URL');

    if (!$rentDetailUrl) {
        $rentDetailUrl = '/rent/#SECTION_CODE_PATH#/#ELEMENT_CODE#/';
    }
    if (!$rentSectionUrl) {
        $rentSectionUrl = '/rent/#SECTION_CODE_PATH#/';
    }

    $arRentParams['DETAIL_URL'] = $rentDetailUrl;
    $arRentParams['SECTION_URL'] = $rentSectionUrl;
    $arRentParams['LIST_URL'] = $rentSectionUrl;

    $APPLICATION->IncludeComponent(
        'bitrix:catalog.section',
        'catalog_block',
        $arRentParams,
        $component
    );

    echo '</div>';
};

// Получаем текущий раздел
if (\Bitrix\Main\Loader::includeModule('iblock')) {
    global $USER_FIELD_MANAGER;

    $currentSectionId = (int)($arResult['SECTION_ID'] ?? 0);

    if ($currentSectionId > 0) {
        $secRow = CIBlockSection::GetByID($currentSectionId)->Fetch();
        $sectionIblockId = (int)($secRow['IBLOCK_ID'] ?? 0);
        $entityId = $sectionIblockId ? 'IBLOCK_' . $sectionIblockId . '_SECTION' : '';

        if ($entityId) {
            $uf = $USER_FIELD_MANAGER->GetUserFields($entityId, $currentSectionId, LANGUAGE_ID);
            if (!empty($uf[$ufCode]['VALUE'])) {
                $rentIds = array_map('intval', (array)$uf[$ufCode]['VALUE']);
            }
        }
    }
}

$bHasRent = !empty($rentIds);
?>

Шаг 4. Вывод в непустом разделе

В ветке if($itemsCnt) (когда товары есть) добавляем вызов:

<?php if ($bHasRent) { $__renderRentBlock(); } ?>

Лучше всего размещать этот вызов после основного списка товаров и пагинации.


Шаг 5. Вывод в пустом разделе

Стандартный блок «Раздел пуст» заменяем условием:

<?else:?>
    <?if(!$iSectionsCount):?>
        <?php
        if ($bHasRent) {
            $__renderRentBlock();
        } else {
        ?>
            <div class="no_goods">
                <div class="no_products">
                    <div class="wrap_text_empty">
                        <?php $APPLICATION->IncludeFile(
                            SITE_DIR."include/section_no_products.php",
                            [],
                            ["MODE" => "html"]
                        ); ?>
                    </div>
                </div>
            </div>
        <?php } ?>
    <?endif;?>
<?endif;?>

Результат

  • Арендные товары добавляются через настройки раздела
  • Корректно отображаются и в пустых, и в непустых разделах
  • Нет дублирования логики и конфликтов шаблонов

Вывод

Такой подход позволяет аккуратно расширять каталог 1С-Битрикс, не смешивая инфоблоки и не ломая архитектуру шаблона. Решение легко масштабируется.

До внесения любых правок в файлы сайта убедитесь в наличии резервной копии.
Комментарии
Name
Email
Phone
Ваше имя
Ваш email
Оставить комментарий
Нажмите для звонка
+7 (499) 341-00-19
Хотите заказать сайт?
Обращайтесь любым удобным способом и мы поможем подобрать интересный вариант для Вас!