Телеграм: @bazarow_ru Почта: mihail@bazarow.ru

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

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

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

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

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

Елена 13.07.2022
Здравствуйте, инструкция -просто огонь. именно то, что надо. у меня несколько вопросов по описанному способу:
1. если несколько полей и соответственно, блоков связанных товаров, то нужно эту операцию проделывать для каждого блока? или как-то их объединить?
2. у меня все равно вывалились все товары, а если ставить условие Если не пустая переменная, то пустое выдаётся. бьюсь второй день.
Михаил Базаров 14.07.2022
Цитата
Елена написал:
Здравствуйте, инструкция -просто огонь. именно то, что надо. у меня несколько вопросов по описанному способу:
1. если несколько полей и соответственно, блоков связанных товаров, то нужно эту операцию проделывать для каждого блока? или как-то их объединить?
2. у меня все равно вывалились все товары, а если ставить условие Если не пустая переменная, то пустое выдаётся. бьюсь второй день.

Немного улучшил заметку.
Проверьте, если вообще что-нибудь в массиве для фильтра.
Код
print_r($arrayLinks);
Елена 07.08.2022
все-таки пришло время добить эту задачу на проекте. и в списке по проверке 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 в такую структуру для меня сложно вставить, а все шаблоны сделаны и работают, если без фильтров.
техподдержка битрикса тоже не может помочь. не работает ни компонент связанных товаров, который рекомендован битриксом, ни этот  вариант, а он гораздо элегантнее.

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

Записная книжка разработчика

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

Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18668 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Вывести свойство отдельно ото всех или исключить из всех Просмотров: 7665 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Вывести компонент новостей на страницу в Битрикс Просмотров: 65107 Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, ч... Определить местоположение пользователя и показать на карте Просмотров: 3957 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ... Показ страницы сайта в боковом слайдере, на примере всплывающей формы... Просмотров: 3204 Если вы хотите сделать подгрузку любой страницы сайта в боковой слайдер, для этого в битри... Ссылка и название раздела в списке новостей Битрикс Просмотров: 11467 Если нужно вывести название раздела инфоблока в котором находится конкретный элемент/новос... Модифицировать состав заказа #ORDER_LIST# в почтовом событии "Новый з... Просмотров: 30308 Если вы хотите как-то по особенному сверстать состав заказа в почтовом уведомлении 1С-Битр... Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс Просмотров: 26773 При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывае... Вывести разделы инфоблока по первым буквам не меняя структуру каталог... Просмотров: 2503 Например: у нас есть инфоблок с большим количеством разделов. И мы хотим, на сайте разбить... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 63137 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1608 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Цвета торговых предложений из Highload инфоблоков в списке товаров Просмотров: 14905 Подвернулся на доработку очень старый сайт, работал еще на 11-ой версии Битрикс. Выполнили... Если пользователь авторизован то... API Битрикс Просмотров: 23720 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Удалить товары из корзины, если есть определенные товары. Просмотров: 1915 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 24530 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в... Очистить брошенные корзины с помощью API 1С-Битрикс Просмотров: 1121 Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их оч... Ленивая подгрузка картинок в компоненте, на vue js Битрикс Просмотров: 10349 Если на одну страницу сайта выводится большое количество картинок, которые могут долго под... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 29183 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И... Вывести все товары, с постраничной навигацией, из всех разделов инфоб... Просмотров: 29884 По сути, эта заметка, небольшой лайфхак. Достаточно часто нужно, в корне каталога, в ТОП-е... FTP доступ на Виртуальной машине Битрикс Просмотров: 17248 Бывает что нужно открыть FTP доступ к заранее известной папке на сайте под управлением 1С ...