Похожие товары в 1C Bitrix

16 октября 2013

Разрабатывая интернет-магазин товаров в 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();

	/* код вывода товаров */
}

На основе данного примера Вы можете написать свой скрипт вывода похожих товаров для своего интернет-магазина.
Желаю удачи в кодонаписании!