Вывод похожих товаров в карточке товара

При создании магазина столкнулся с такой интересной задачей, в карточке товара необходимо было сделать вывод похожих товаров. Похожесть товаров определялась так , товар должен был быть из такой же категории, инфоблока и так же у него должно совпадать максимальное количество свойств с товаром в карточке которого мы находимся.
Писать отдельный компонент для этой задачи я не увидел смысла, поэтому кастомизировал текущий , приступим :)
Для начала нам надо дать возможность в комплексном компоненте каталога bitrix:catalog указывать по каким свойствам надо определять похожесть, для этого в файле .parameters.php (у меня он находится тут bitrix/templates/.default/components/bitrix/catalog/.default/.parameters.php ) создадим возможность для выбора свойств добавим код
//это для упрощения выбора свойств
$rsProp = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"]));
while ($arr=$rsProp->Fetch())
{
if($arr["PROPERTY_TYPE"] != "F")
$arProperty[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
if($arr["PROPERTY_TYPE"]=="N")
$arProperty_N[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
if($arr["PROPERTY_TYPE"]!="F")
{
if($arr["MULTIPLE"] == "Y")
$arProperty_X[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
elseif($arr["PROPERTY_TYPE"] == "L")
$arProperty_X[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
elseif($arr["PROPERTY_TYPE"] == "E" && $arr["LINK_IBLOCK_ID"] > 0)
$arProperty_X[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
}
}
$arTemplateParameters = array(
//это само свойство
"DETAIL_PROPS_ANALOG" => array(
"PARENT" => "DETAIL_SETTINGS",
"NAME" => GetMessage("DETAIL_PROPS_ANALOG"),
"TYPE" => "LIST",
"MULTIPLE" => "Y",
"VALUES" => $arProperty,
"ADDITIONAL_VALUES" => "Y",
),
);
Теперь добавим этот параметр в вывод детальной карточки элемента в шаблоне element.php
$APPLICATION->IncludeComponent(
"bitrix:catalog.element",
"",
Array(
/****начало****/
"DETAIL_PROPS_ANALOG" => $arParams["DETAIL_PROPS_ANALOG"],
/****конец***/
),
$component
);
Далее нам надо создать файл result_modifier.php (если его нет) ,в нем будет логика выборки у меня он находился тут bitrix/templates/.default/components/bitrix/catalog/.default/bitrix/catalog.element/.default/result_modifier.php
if($arParams['DETAIL_PROPS_ANALOG']) {
// сделаем вывод похожих товаров
$arSelect = Array(
"ID",
"LANG_DIR",
"IBLOCK_CODE",
"IBLOCK_ID",
"IBLOCK_SECTION_ID",
"CODE",
"NAME",
"PREVIEW_PICTURE",
"DETAIL_PICTURE",
"DETAIL_PAGE_URL"
);
// это для того что бы определить какую цену выбирать из базы
foreach($arParams['PRICE_CODE'] as $price) {
$dbPriceType = CCatalogGroup::GetList(
array("SORT" => "ASC"),
array("NAME" => $price)
);
while ($arPriceType = $dbPriceType->Fetch()){
$arSelect[] = 'CATALOG_GROUP_'.$arPriceType['ID'];
$arResult['PRICE_ID'][] = $arPriceType['ID'];
}
}
// для выборки свойств по которым будем сравнивать
foreach($arParams['DETAIL_PROPS_ANALOG'] as $det_props) {
if($det_props != ''){
$arSelect[] = 'PROPERTY_'.$det_props;
}
}
$arSelect[] = 'PROPERTY_PRODUCT_NAME';
// фильтрование, в данном случае из того же инфоблока , раздела, активные и только с картинками
$arFilter = Array(
"IBLOCK_ID"=>$arResult["IBLOCK_ID"] ,
"SECTION_ID" => $arResult["SECTION"]["ID"], "ACTIVE"=>"Y" ,
"!ID" => $arResult["ID"],
"!DETAIL_PICTURE" => false
);
$arr_analogs = CIBlockElement::GetList(Array("RAND" => "ASC"), $arFilter, false, false, $arSelect);
$analog_count_id = array();
while($arr_analog = $arr_analogs->GetNextElement())
{
$element = $arr_analog->GetFields();
// теперь сравним товарары
$i = 0;
foreach($arParams['DETAIL_PROPS_ANALOG'] as $analog_propers) {
if($arResult['PROPERTIES'][$analog_propers]['VALUE'] == $element['PROPERTY_'.$analog_propers.'_VALUE']) {
$i++;
}
}
$analog_count_id[$element['ID']] = $i;
// этот код нужен для создания не превью товара
if($element["PREVIEW_PICTURE"]) {
$more_element_img = CFile::ResizeImageGet(
$element["PREVIEW_PICTURE"],
array("width" => 65, "height" => 70),
BX_RESIZE_IMAGE_PROPORTIONAL_ALT,
true
);
}
elseif($element["DETAIL_PICTURE"]) {
$more_element_img = CFile::ResizeImageGet(
$element["DETAIL_PICTURE"],
array("width" => 65, "height" => 70),
BX_RESIZE_IMAGE_PROPORTIONAL_ALT,
true
);
}
$element['PICTURE']['WIDTH'] = $more_element_img["width"];
$element['PICTURE']['HEIGHT'] = $more_element_img["height"];
$element['PICTURE']['SRC'] = $more_element_img["src"];
unset($more_element_img);
$analog[$element['ID']] = $element;
}
arsort($analog_count_id);
foreach($analog_count_id as $k => $v) {
$arResult["ANALOG"][$k] = $analog[$k];
}
}
Теперь последний этап сделать вывод уже в шаблоне детальной карточки товара в цикле
foreach($arResult["ANALOG"] as $analog):
//ваш шаблон
endforeach;

Вывод похожих товаров в карточке товара - 594704697846

Комментарии

Комментариев нет.