Достаточно часто, при разработке магазинов на битрикс, требуется выводить связанные элементы внутри карточки товара. Данный блок, может называться как угодно и преследовать различные маркетинговые цели. Например, для блоков: Рекомендуем посмотреть, Аналоги, Похожие товары итд.
В битрикс уже есть компонент для вывода свзанных элементов - 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...
}
Если в массиве для фильтра не ноль (точнее, больше ноля) элементов, выводим раздел каталога.
Цитата |
---|
Елена написал: я уже всякое попробовала. даже переименовала свойство в исходное как в примере - не работает. может быть, не в компонент эпилог это надо ставить? в общем, я грущу. у кого-то все товары выводит, у меня - вообще ни одного. хз как так. |
Скиньте прямо сюда весь шаблон, посмотрю - может быть увижу что-то.
Буквально вчера этим же способом воспользовался, все работает.
Цитата |
---|
Гость написал: Добрый день. Подскажите, где находится шаблон вывода. Все связанные элементы отображаются в одну колонку |
Просто используете любой из своих шаблонов или создайте новый на основе встроенных.
Делал на компоненте news.detail, работает)))
if (count($arrayLinks) > 0) {
... Фильтр и catalog.section...
}
У меня почему-то если нет связанных товаров, в массиве одно значение:
array(1) { [0]=> NULL }
Надо чуть по-другому будет проверить. Возможно это я чет не так конечно сделал.
Код |
---|
if (count($arrayLinks) > 1) { ... Фильтр и catalog.section... } |
Цитата |
---|
Гость написал: Здравствуйте! Вот страница 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" => "[{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':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 );?> |