Связанные элементы в карточке товара, с помощью catalog.section

Просмотров: 22394

Достаточно часто, при разработке магазинов на битрикс, требуется выводить связанные элементы внутри карточки товара. Данный блок, может называться как угодно и преследовать различные маркетинговые цели. Например, для блоков: Рекомендуем посмотреть, Аналоги, Похожие товары итд.

В битрикс уже есть компонент для вывода свзанных элементов - catalog.link.list, но мы используем catalog.section. Благодаря этому, во первых, получим большую гибкость и управляемость. Во вторых, удобно хранить все в одном шаблоне: и для результатов поиска и для раздела каталога и в принципе, для вывода catalog.section в любом месте сайта с единным шаблоном оформления.

свойство типа привязка к элементам

Свойство типа привязка к элементам и вывод связанных товаров

Для начала, в инфоблоке каталога создаем свойство "SIMILAR_PRODUCT", в котором будут храниться ID связанных элементов. Используем, тип свойства "Привязка к элементам", делаем его множественным и в настройках свойства указываем этот же инфоблок (каталог), в качестве привязки:

Далее, в шаблоне детальной карточки товара в комплексном шаблоне каталога, содаем файл component_epilog.php Внутри которого размещаем следующий код:

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
if (CModule::IncludeModule("iblock")):
    $elementID = $arResult['ID'];
    $iblockId = $arResult['IBLOCK_ID'];
    $arrayLinks = array();
    $linkedArray = CIBlockElement::GetList(
        Array("ID" => "ASC"),
        Array("IBLOCK_ID" => $iblockId, "ID" => $elementID),
        false,
        false,
        Array(
            'ID',
            'PROPERTY_SIMILAR_PRODUCT'
        )
    );
    while ($ar_fields = $linkedArray->Fetch()) {
        $arrayLinks[] = $ar_fields['PROPERTY_SIMILAR_PRODUCT_VALUE']; //ID связанных элементов в масиив
    }
    endif;

Мы знаем ID текущего элемента ($arResult['ID']), знаем его инфоблок ($arResult['IBLOCK_ID']) и создали пустой массив $arrayLinks

С помощью CIBlockElement::GetList мы получили свойство, текущего элемента, SIMILAR_PRODUCT и загнали айдишники связанных элементов в массив $arrayLinks

Дело осталось за малым: после данного кода выводим bitrix:catalog.section. Настраиваем его как нам нужно: инфоблок, все необходимые данные, шаблон итд. Если сейчас посмотрим в карточку товара, увидем вывод вообще всех товаров из каталога. Нам осталось, только отфильтровать нужные товары (связанные с текущим).

Мы знаем ID-шники всех связанных товаров, в массиве $arrayLinks. Просто используем его в глобальном фильтре. Над вызовом bitrix:catalog.section навешиваем фильтр


$GLOBALS['arrFilterLinked'] = array('=ID' => $arrayLinks);

И указываем этот фильтр в выводе bitrix:catalog.section


"FILTER_NAME" => "arrFilterLinked",

В общем-то и все, теперь в карточке товара будут выводиться только связанные с ним элементы (товары).

Последний штрих

Так как bitrix:catalog.section в любом случае отработает в карточке, даже если у текущего товара нет связанных элементов, просто ни чего не отфильтрует. Есть резон снять эту нагрузку, обвернув вызов глобального фильтра и catalog.section в условие:

if (count($arrayLinks) > 0) {
	... Фильтр и catalog.section...
}

Если в массиве для фильтра не ноль (точнее, больше ноля) элементов, выводим раздел каталога.

Гость 23.08.2022
Добрый день. Подскажите, где находится шаблон вывода. Все связанные элементы отображаются в одну колонку
Михаил Базаров 23.08.2022
Цитата
Гость написал: Добрый день. Подскажите, где находится шаблон вывода. Все связанные элементы отображаются в одну колонку

Просто используете любой из своих шаблонов или создайте новый на основе встроенных.
Николай 02.02.2023
Все работает, спасибо, только не понял почему мы весь код пишем в component_epilog.php, ведь тогда этот блок выведется в конце сайта, а мне надо было где-то по середине. Поэтому весь код вставил в template.php детальной страницы.
Делал на компоненте news.detail, работает)))
Николай 02.02.2023
И в самом конце проверка
if (count($arrayLinks) > 0) {
... Фильтр и catalog.section...
}
У меня почему-то если нет связанных товаров, в массиве одно значение:
array(1) { [0]=> NULL }

Надо чуть по-другому будет проверить. Возможно это я чет не так конечно сделал.
Михаил Базаров 03.02.2023
Да, пока не разберетесь можно проверять на больше одного

Код
if (count($arrayLinks) > 1) {
... Фильтр и catalog.section...
}
Гость 22.09.2023
Здравствуйте! Вот страница https://mypricep.ru/novaya-stranitsa.php на которой пытаюсь вывести сопутствующие товары. Массив с ID сопутсвующих товаров выводит Array ( [0] => 3163 [1] => 3164 [2] => 3165 [3] => 3166 [4] => 3167 [5] => 3168 [6] => 3136 [7] => 3148 [8] => 3149 [9] => 3150 [10] => 3151 [11] => 3152 [12] => 3153 [13] => 3154 [14] => 3155 [15] => 3156 [16] => 3157 [17] => 3158 [18] => 3159 [19] => 3160 [20] => 3161 [21] => 3140 [22] => 3162 ), но фильтр к компоненту section не применяется. В чем может быть проблема?
Гость 22.09.2023
Цитата
Гость написал:
Здравствуйте! Вот страница https://mypricep.ru/novaya-stranitsa.php на которой пытаюсь вывести сопутствующие товары. Массив с ID сопутсвующих товаров выводит

Array ( [0] => 3163 [1] => 3164 [2] => 3165 [3] => 3166 [4] => 3167 [5] => 3168 [6] => 3136 [7] => 3148 [8] => 3149 [9] => 3150 [10] => 3151 [11] => 3152 [12] => 3153 [13] => 3154 [14] => 3155 [15] => 3156 [16] => 3157 [17] => 3158 [18] => 3159 [19] => 3160 [20] => 3161 [21] => 3140 [22] => 3162 ), но фильтр к компоненту section не применяется. В чем может быть проблема?                
На странице вывел компонент таким образом.
Код
<?
$GLOBALS['arrFilterLinked'] = array('=ID' => $arrayLinks);
$APPLICATION->IncludeComponent(
   "bitrix:catalog.section", 
   ".default", 
   array(
      "COMPONENT_TEMPLATE" => ".default",
      "IBLOCK_TYPE" => "catalog",
      "IBLOCK_ID" => "5",
      "SECTION_ID" => $_REQUEST["SECTION_ID"],
      "SECTION_CODE" => "",
      "SECTION_USER_FIELDS" => array(
         0 => "",
         1 => "",
      ),
      "FILTER_NAME" => "arrFilterLinked",
      "INCLUDE_SUBSECTIONS" => "A",
      "SHOW_ALL_WO_SECTION" => "N",
      "CUSTOM_FILTER" => "{\"CLASS_ID\":\"CondGroup\",\"DATA\":{\"All\":\"AND\",\"True\":\"True\"},\"CHILDREN\":[]}",
      "HIDE_NOT_AVAILABLE" => "N",
      "HIDE_NOT_AVAILABLE_OFFERS" => "N",
      "ELEMENT_SORT_FIELD" => "sort",
      "ELEMENT_SORT_ORDER" => "asc",
      "ELEMENT_SORT_FIELD2" => "id",
      "ELEMENT_SORT_ORDER2" => "desc",
      "OFFERS_SORT_FIELD" => "sort",
      "OFFERS_SORT_ORDER" => "asc",
      "OFFERS_SORT_FIELD2" => "id",
      "OFFERS_SORT_ORDER2" => "desc",
      "PAGE_ELEMENT_COUNT" => "18",
      "LINE_ELEMENT_COUNT" => "3",
      "PROPERTY_CODE" => array(
         0 => "",
         1 => "",
      ),
      "PROPERTY_CODE_MOBILE" => array(
      ),
      "OFFERS_FIELD_CODE" => array(
         0 => "",
         1 => "",
      ),
      "OFFERS_PROPERTY_CODE" => array(
         0 => "",
         1 => "",
      ),
      "BACKGROUND_IMAGE" => "-",
      "TEMPLATE_THEME" => "blue",
      "PRODUCT_ROW_VARIANTS" => "[{&#39;VARIANT&#39;:&#39;2&#39;,&#39;BIG_DATA&#39;:false},{&#39;VARIANT&#39;:&#39;2&#39;,&#39;BIG_DATA&#39;:false},{&#39;VARIANT&#39;:&#39;2&#39;,&#39;BIG_DATA&#39;:false},{&#39;VARIANT&#39;:&#39;2&#39;,&#39;BIG_DATA&#39;:false},{&#39;VARIANT&#39;:&#39;2&#39;,&#39;BIG_DATA&#39;:false},{&#39;VARIANT&#39;:&#39;2&#39;,&#39;BIG_DATA&#39;:false}]",
      "ENLARGE_PRODUCT" => "STRICT",
      "PRODUCT_BLOCKS_ORDER" => "price,props,sku,quantityLimit,quantity,buttons",
      "SHOW_SLIDER" => "Y",
      "SLIDER_INTERVAL" => "3000",
      "SLIDER_PROGRESS" => "N",
      "PRODUCT_DISPLAY_MODE" => "N",
      "ADD_PICT_PROP" => "-",
      "LABEL_PROP" => array(
      ),
      "PRODUCT_SUBSCRIPTION" => "Y",
      "SHOW_DISCOUNT_PERCENT" => "N",
      "SHOW_OLD_PRICE" => "N",
      "SHOW_MAX_QUANTITY" => "N",
      "SHOW_CLOSE_POPUP" => "N",
      "MESS_BTN_BUY" => "Купить",
      "MESS_BTN_ADD_TO_BASKET" => "В корзину",
      "MESS_BTN_SUBSCRIBE" => "Подписаться",
      "MESS_BTN_DETAIL" => "Подробнее",
      "MESS_NOT_AVAILABLE" => "Нет в наличии",
      "MESS_NOT_AVAILABLE_SERVICE" => "Недоступно",
      "RCM_TYPE" => "personal",
      "RCM_PROD_ID" => $_REQUEST["PRODUCT_ID"],
      "SHOW_FROM_SECTION" => "N",
      "SECTION_URL" => "",
      "DETAIL_URL" => "",
      "SECTION_ID_VARIABLE" => "SECTION_ID",
      "SEF_MODE" => "N",
      "AJAX_MODE" => "N",
      "AJAX_OPTION_JUMP" => "N",
      "AJAX_OPTION_STYLE" => "Y",
      "AJAX_OPTION_HISTORY" => "N",
      "AJAX_OPTION_ADDITIONAL" => "",
      "CACHE_TYPE" => "A",
      "CACHE_TIME" => "36000000",
      "CACHE_GROUPS" => "Y",
      "SET_TITLE" => "Y",
      "SET_BROWSER_TITLE" => "Y",
      "BROWSER_TITLE" => "-",
      "SET_META_KEYWORDS" => "Y",
      "META_KEYWORDS" => "-",
      "SET_META_DESCRIPTION" => "Y",
      "META_DESCRIPTION" => "-",
      "SET_LAST_MODIFIED" => "N",
      "USE_MAIN_ELEMENT_SECTION" => "N",
      "ADD_SECTIONS_CHAIN" => "N",
      "CACHE_FILTER" => "N",
      "ACTION_VARIABLE" => "action",
      "PRODUCT_ID_VARIABLE" => "id",
      "PRICE_CODE" => array(
      ),
      "USE_PRICE_COUNT" => "N",
      "SHOW_PRICE_COUNT" => "1",
      "PRICE_VAT_INCLUDE" => "Y",
      "CONVERT_CURRENCY" => "N",
      "BASKET_URL" => "/personal/basket.php",
      "USE_PRODUCT_QUANTITY" => "N",
      "PRODUCT_QUANTITY_VARIABLE" => "quantity",
      "ADD_PROPERTIES_TO_BASKET" => "Y",
      "PRODUCT_PROPS_VARIABLE" => "prop",
      "PARTIAL_PRODUCT_PROPERTIES" => "N",
      "PRODUCT_PROPERTIES" => array(
      ),
      "OFFERS_CART_PROPERTIES" => array(
      ),
      "ADD_TO_BASKET_ACTION" => "ADD",
      "DISPLAY_COMPARE" => "N",
      "USE_ENHANCED_ECOMMERCE" => "N",
      "PAGER_TEMPLATE" => ".default",
      "DISPLAY_TOP_PAGER" => "N",
      "DISPLAY_BOTTOM_PAGER" => "Y",
      "PAGER_TITLE" => "Товары",
      "PAGER_SHOW_ALWAYS" => "N",
      "PAGER_DESC_NUMBERING" => "N",
      "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
      "PAGER_SHOW_ALL" => "N",
      "PAGER_BASE_LINK_ENABLE" => "N",
      "LAZY_LOAD" => "N",
      "MESS_BTN_LAZY_LOAD" => "Показать ещё",
      "LOAD_ON_SCROLL" => "N",
      "SET_STATUS_404" => "N",
      "SHOW_404" => "N",
      "MESSAGE_404" => "",
      "COMPATIBLE_MODE" => "N",
      "DISABLE_INIT_JS_IN_COMPONENT" => "N"
   ),
   false
);?>
Александр 22.09.2023
Попробовал echo '<pre>'.print_r($GLOBALS['arrFilterLinked'], true).'</pre>'; выводит пустоту. т.е id не в global не уходят.
Иван 15.08.2024
Подскажите, пожалуйста, Михаил, как можно решить обратную задачу.
Т.е. связь в одну сторону настроена, а теперь у элемента на который мы ссылаемся (который привязали) как найти все элементы, которые на него ссылаются?
Подозреваю, что нужен фильтр инфоблока по дочерним элементам, верно? Подскажите как его организовать если может быть несколько дочерних элементов и на один документ может быть несколько ссылок?
Михаил Базаров 16.08.2024
Пока ни чего умнее в голову не приходит с ходу.
Но, видимо придется в каждом товаре проходиться по всем товарам каталога (а если их много это так себе решение) в поисках - а не встречается ли текущий товар в свойстве привязки любого из товаров каталога.

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

Основные функции вывода в шаблонах Битрикс

Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну кучку. Ведь у каждого бывают мо...

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

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

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

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

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в инфоблок. Способов реализации...

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

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

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