Разрабатывая интернет-магазин товаров в 1C Bitrix, Вы обязательно задумываетесь о выводе похожий предложений на странице товара.
Можно написать скрипт, автоматически отбирающий релевантные товары или в ручную указывать какие именно товары будут выводится в блоке похожих предложений.
Я расскажу Вам как совместить эти два варианта вывода похожих записей.
Пример будет следующий. Интернет-магазин с категориями товаров.
В инфоблоке категории добавляем новое свойство "Похожие предложения" (тип: привязка к элементам, множественное: да, код: PRODUCTS_RELATED).
У элемента (товара) напротив поля "Похожие предложения" нажимаем "Добавить" и добавляем товары, которые будут выводится в списке похожих предложений.
Из url страницы товара мы знаем коды инфоблока и товара, поэтому необходимо сначала узнать ID элемента.
В 1C Bitrix это можно сделать используя функцию GetList класса CIBlockElement, указав в параметры коды инфоблока и товара.
//$IBLOCK_CODE - код инфоблока //$ELEMENT_CODE - код элемента $result_list = CIBlockElement::GetList(Array(), Array("IBLOCK_CODE" => $IBLOCK_CODE, "CODE" => $ELEMENT_CODE), false, Array(), Array("ID")); while($ob = $result_list->GetNextElement()) { $arFields = $ob->GetFields(); $ELEMENT_ID = $arFields['ID']; break; }
Теперь в переменной $ELEMENT_ID содержится значение ID элемента (товара) и можно приступать к написанию кода, выбирающий похожие предложения.
$products_related_count = 0; $products_related_list = ''; $arFilter = array("IBLOCK_TYPE" => "catalog", "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", "!CODE" => $ELEMENT_CODE, "IBLOCK_CODE" => $IBLOCK_CODE); //Фильтр по-умолчанию if( !empty($ELEMENT_ID) ) { $arElement = GetIBlockElement($ELEMENT_ID); $PRODUCT_PROPERTIES = $arElement["PROPERTIES"]; $PRODUCTS_RELATED = $PRODUCT_PROPERTIES["PRODUCTS_RELATED"]["VALUE"]; //Получаем свойство с похожими предложениями if( !empty($PRODUCTS_RELATED) && is_array($PRODUCTS_RELATED) ) { //Если присутствуют записи $arFilter = array_merge($arFilter, array("ID" => $PRODUCTS_RELATED)); // то добавляем их в фильтр } else {//Если похожие предложения заданы не были, то ищем текущий товар в списке похожих предложений других товаров $products_related_list = CIBlockElement::GetList( array('SORT' => 'DESC', 'RAND' => 'ASC'), array("IBLOCK_TYPE" => "catalog", "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", "!CODE" => $ELEMENT_CODE, "IBLOCK_CODE" => $IBLOCK_CODE, 'PROPERTY_PRODUCTS_RELATED' => $ELEMENT_ID), false, array("nPageSize" => 5), array() ); $products_related_count = $products_related_list->SelectedRowsCount(); while($ob = $products_related_list->GetNextElement()) { $arElement = GetIBlockElement($arElement["ID"]); $PRODUCT_PROPERTIES = $arElement["PROPERTIES"]; $PRODUCTS_RELATED = $PRODUCT_PROPERTIES["PRODUCTS_RELATED"]["VALUE"]; if( !empty($PRODUCTS_RELATED) && is_array($PRODUCTS_RELATED) ) { $PRODUCTS_RELATED = array_merge($PRODUCTS_RELATED, array($arElement["ID"])); $arFilter = array_merge($arFilter, array("ID" => $PRODUCTS_RELATED)); } } } }
Переменная $arFilter является значением параметра функции GetList, являющий критерием отбора похожих предложений. Таким образом, если похожие товары явно не заданы, будут выбраны товары из категории текущего товара в случайном порядке.
$elementItems = CIBlockElement::GetList(Array('SORT' => 'DESC', 'RAND' => 'ASC'), $arFilter, false, Array("nPageSize" => 5), Array());//Выбирает 5 похожих товара $count_items = $elementItems->SelectedRowsCount(); while($ob = $elementItems->GetNextElement()) { $arElement = $ob->GetFields(); /* код вывода товаров */ }
На основе данного примера Вы можете написать свой скрипт вывода похожих товаров для своего интернет-магазина.
Желаю удачи в кодонаписании!