Достаточно часто, при разработке магазинов на битрикс, требуется выводить связанные элементы внутри карточки товара. Данный блок, может называться как угодно и преследовать различные маркетинговые цели. Например, для блоков: Рекомендуем посмотреть, Аналоги, похожие товары итд.
В битрикс уже есть компонент для вывода свзанных элементов - 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...
}
Если в массиве для фильтра не ноль (точнее, больше ноля) элементов, выводим раздел каталога.
1. если несколько полей и соответственно, блоков связанных товаров, то нужно эту операцию проделывать для каждого блока? или как-то их объединить?
2. у меня все равно вывалились все товары, а если ставить условие Если не пустая переменная, то пустое выдаётся. бьюсь второй день.

Цитата |
---|
Елена написал: Здравствуйте, инструкция -просто огонь. именно то, что надо. у меня несколько вопросов по описанному способу: 1. если несколько полей и соответственно, блоков связанных товаров, то нужно эту операцию проделывать для каждого блока? или как-то их объединить? 2. у меня все равно вывалились все товары, а если ставить условие Если не пустая переменная, то пустое выдаётся. бьюсь второй день. |
Немного улучшил заметку.
Проверьте, если вообще что-нибудь в массиве для фильтра.
Код |
---|
print_r($arrayLinks); |
<?foreach($arResult["PROPERTIES"]["ANALOG"]["VALUE"] as $analog):?>
<?$res = CIBlockElement::GetByID($analog);?>
<?if($ar_res = $res->GetNext())?>
<li><b><a href='<?=$ar_res["DETAIL_PAGE_URL"];?>'><?=$ar_res["NAME"];?></a></b></li>
<?endforeach;?>
выводится все корректно. но так вручную цеплять странно. компонент catalog.item в такую структуру для меня сложно вставить, а все шаблоны сделаны и работают, если без фильтров.
техподдержка битрикса тоже не может помочь. не работает ни компонент связанных товаров, который рекомендован битриксом, ни этот вариант, а он гораздо элегантнее.
я уже всякое попробовала. даже переименовала свойство в исходное как в примере - не работает. может быть, не в компонент эпилог это надо ставить? в общем, я грущу. у кого-то все товары выводит, у меня - вообще ни одного. хз как так.

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

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

Код |
---|
if (count($arrayLinks) > 1) { ... Фильтр и catalog.section... } |