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

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

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

В битрикс уже есть компонент для вывода свзанных элементов - 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...
}

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

Михаил Базаров 08.08.2022
Цитата
Елена написал:
я уже всякое попробовала. даже переименовала свойство в исходное как в примере - не работает. может быть, не в компонент эпилог это надо ставить? в общем, я грущу. у кого-то все товары выводит, у меня - вообще ни одного. хз как так.  


Скиньте прямо сюда весь шаблон, посмотрю - может быть увижу что-то.
Буквально вчера этим же способом воспользовался, все работает.
Елена 08.08.2022
хочу загрузить, но и на архив zip, и на php пишут мне - неверный тип файла. и txt не грузится. отправила на почту)  
Гость 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 не уходят.