Вывести товары из того же раздела в карточке товара

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

  • При создании магазина одежды вывести в карточке блок "Другие юбки (штаны, майки и.т.д)"
  • В магазине бытовой техники вывести товары того же бренда или той же направленности
  • С точки зрения юзабилити и продаж, показать клиентам, пришедшим из поиска сразу в карточку товара, другие товары своего магазина
  • С точки зрения СЕО - это достаточно быстрый способ перелинковать страницы товаров

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

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

Выводим в любом месте сайта компонент "Элементы раздела", полностью его настраиваем, верстаем или применяем нужный шаблон и настраиваем на вывод товаров любого раздела нашего каталога. К тому же не забываем настроить ЧПУ таким же образом, как это сделано в основном каталоге.

Далее забираем весь вывод компонента с помощью просмотра исходного кода:

Переходим в шаблон нашего каталога к файлу, который содержит в себе вывод детальной карточки товара по пути

/bitrix/templates/ШАБЛОН_САЙТА/components/bitrix/catalog/ШАБЛОН_КАТАЛОГА/element.php

И вставляем скопированный код компонента "Элементы раздела" в самый низ этого файла. После этого все заработает. Убедитесь пройдя в карточку любого товара. Единственное что нам осталось - передать символьный код текущего для товара раздела в этот компонент. Иначе во всех товарах будет одно и тоже.

Находим две строчки:

"SECTION_ID" => "",
"SECTION_CODE" => "",

В них то и передаем либо ID либо CODE текущего раздела

//передаст символьный код
"SECTION_ID" => "",
"SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],

//передаст ID
"SECTION_ID" => "$arResult["VARIABLES"]["SECTION_ID"]",
"SECTION_CODE" => "",

Используйте что-то одно, второй должен остаться пустым. Само собой, если у ваших разделов нет SECTION_CODE, то использовать можно только SECTION_ID

Еще в записках:
Все заметки
Уважаемый читатель! В связи с участившимся спамом в комментариях, возможность писать доступна только для зарегистрированных пользователей

Зарегистрироваться Войти
Напомнить пароль

Быстрая регистрация через соц.сеть:
Гость сайта
А можешь подсказать как допилить чтоб не показывался тот товар на котором находишься?
Иван
Спасибо тебе большое, помог решить проблему. Сколько берешь за услуги интеграции с Битрикс уже сверстанного дизайна? Скоро может понадобиться.
Михаил Базаров
Цитата
Гость сайта пишет:
А можешь подсказать как допилить чтоб не показывался тот товар на котором находишься?
Перед выводом товаров поставить

Код
$GLOBALS['NotItItem'] = array('!ID' => $arResult["ID"]); 

В самом catalog.section добавить этот фильтр

Код
"FILTER_NAME" => "NotItItem", 
Александр Силуянов
Михаил, это работает только в каталоге.
Подскажите как реализовать на редакции Стандарт в компоненте news.list?
Заранее благодарен.
Алексей Сель
Михаил, скажите пожалуйста, этот метод еще актуален? Никак не могу передать ни id ни символьный код, в результате товары у меня не выводятся.
Михаил Базаров
Цитата
Алексей Сель написал:
Михаил, скажите пожалуйста, этот метод еще актуален? Никак не могу передать ни id ни символьный код, в результате товары у меня не выводятся.
Да, актуален. Ищите ошибку у себя. Буквально дня три назад делал на самой свежей версии Битрикс. Да и в принципе, в этом плане не могло что-то измениться
mtsub
как сделать адреса разделов: site.ru/catalog/#SECTION_CODE#/
а карточек товаров: site.ru/product/#ELEMENT_CODE#/ - без "catalog"
mtsub
у меня товары не выводятся - 404 ошибка, переиндексацию делать. кеш сбрасывал.
Antik
Цитата
mtsub написал:
у меня товары не выводятся - 404 ошибка, переиндексацию делать. кеш сбрасывал.
у вас директории такой нет, catalog это физическая директория комплексного компонента, а не просто виртуальный путь
Михаил Базаров
Цитата
mtsub написал:
как сделать адреса разделов: site.ru/catalog/#SECTION_CODE#/
а карточек товаров: site.ru/product/#ELEMENT_CODE#/ - без "catalog"
Просто в ЧПУ так и вставить, нужные url и в настройках инфоблока не забыть сделать так же
Олег Барбул
Цитата
Михаил Базаров написал:
Цитата
Гость сайта пишет:
А можешь подсказать как допилить чтоб не показывался тот товар на котором находишься?
Перед выводом товаров поставить
Код
 $GLOBALS['NotItItem'] = array('!ID' => $arResult["ID"]); 

В самом catalog.section добавить этот фильтр
Код
 "FILTER_NAME" => "NotItItem", 
Подскажите в чем ошибка.

В компоненте ставлю
Код
<?$APPLICATION->IncludeComponent(   "bitrix:catalog.section",
"list",
array(
"FILTER_NAME" => "NotItItem",
"ACTION_VARIABLE" => "action",
"ADD_PICT_PROP" => "MORE_PHOTO",
"ADD_PROPERTIES_TO_BASKET" => "N",
"ADD_SECTIONS_CHAIN" => "N",
"ADD_TO_BASKET_ACTION" => "ADD",

Потом в template.php
Код
<ul class="list">
<?
$GLOBALS['NotItItem'] = array('!ID' => $arResult["ID"]);
foreach($arResult["ITEMS"] as $cell=>$arElement):
   $width = 0;
   $this->AddEditAction($arElement['ID'], $arElement['EDIT_LINK'], CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_EDIT"));
   $this->AddDeleteAction($arElement['ID'], $arElement['DELETE_LINK'], CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CATALOG_ELEMENT_DELETE_CONFIRM')));
?>
<li>
<div class="cover">
<?
   if(is_array($arElement["PREVIEW_PICTURE"])):
      $width = $arElement["PREVIEW_PICTURE"]["WIDTH"];
?>
   <div class="img">
<a href="<?=$arElement["DETAIL_PAGE_URL"]?>"><img src="<?=$arElement["PREVIEW_PICTURE"]["SRC"]?>" alt="<?=$arElement["NAME"]?>" /></a>
   </div>
<?
   elseif(is_array($arElement["DETAIL_PICTURE"])):
      $width = $arElement["DETAIL_PICTURE"]["WIDTH"];
?>
   <div class="img">
<a href="<?=$arElement["DETAIL_PAGE_URL"]?>"><img src="<?=$arElement["DETAIL_PICTURE"]["SRC"]?>" alt="<?=$arElement["NAME"]?>" /></a>
   </div>
<?
   endif;
?>
<a href="<?=$arElement["DETAIL_PAGE_URL"]?>" class="head"><?=$arElement["NAME"]?></a>
<div class="text">Цена за полотно</div> <div class="price"><? echo $arElement['DISPLAY_PROPERTIES']['price']['~VALUE'];?> р.</div>
<a href="<?=$arElement["DETAIL_PAGE_URL"]?>" class="but">О моделе</a>
</div><!--cover-->
</li>
   <?}?>
<?
endforeach; // foreach($arResult["ITEMS"] as $arElement):
?>
</ul>



Где ошибка, потому что товар продолжает отображаться (
mtsub
Цитата
Михаил Базаров пишет:
Цитата
mtsub написал:
как сделать адреса разделов: site.ru/catalog/#SECTION_CODE#/
а карточек товаров: site.ru/product/#ELEMENT_CODE#/ - без "catalog"
Просто в ЧПУ так и вставить, нужные url и в настройках инфоблока не забыть сделать так же
уточнение в карточке вместо catalog нужен product - просто в настройках это не решается, попробуйте сами.
mtsub
а в разделах - как обычно catalog должен остаться
Михаил Базаров
Цитата
mtsub написал:
Цитата
Михаил Базаров  пишет:
Цитата
mtsub написал:
как сделать адреса разделов: site.ru/catalog/#SECTION_CODE#/
а карточек товаров: site.ru/product/#ELEMENT_CODE#/ - без "catalog"
Просто в ЧПУ так и вставить, нужные url и в настройках инфоблока не забыть сделать так же
уточнение в карточке вместо catalog нужен product - просто в настройках это не решается, попробуйте сами.
Вам надо создать его физически
В /catalog/ вывод не всего компонента catalog а только catalog.section (главное правилььно на строить)
А вот в /element/ можно весь catalog
Но, важно: что бы не было дубликатов страниц (для поисковиков) в section.php каталога лучше все удалить или сделать редирект в раздел /catalog/

PS: Пояснил достаточно кратко, там много нюансов в плане СЕО- при таком подходе. Делайте внимательно и вдумчиво

© 2011—2017 Частный вебмастер: ИП Базаров, ОГРНИП: 315784700173692. Работает на 1С-Битрикс.

Копирование материалов запрещено: "ГК РФ, часть 4, раздел VII: Права на результаты интеллектуальной деятельности".

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