При создании магазина столкнулся с такой интересной задачей, в карточке товара необходимо было сделать вывод похожих товаров. Похожесть товаров определялась так , товар должен был быть из такой же категории, инфоблока и так же у него должно совпадать максимальное количество свойств с товаром в карточке которого мы находимся. Писать отдельный компонент для этой задачи я не увидел смысла, поэтому кастомизировал текущий , приступим Для начала нам надо дать возможность в комплексном компоненте каталога bitrix:catalog указывать по каким свойствам надо определять похожесть, для этого в файле .parameters.php (у меня он находится тут bitrix/templates/.default/components/bitrix/catalog/.default/.parameters.php ) создадим возможность для выбора свойств добавим код
Далее нам надо создать файл 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;
1.выводит товары не только похожие-но и у которых свойство не совпадают. // теперь сравним товарары $i = 0; foreach($arParams['DETAIL_PROPS_ANALOG'] as $key => $analog_propers) { //.strtoupper($analog_propers) для тех кто прописывает символьный код свойства при создании маленькими буквами if($arResult['PROPERTIES'][$analog_propers]['VALUE'] == $element['PROPERTY_'.strtoupper($analog_propers).'_VALUE']) { $i++; } else{} } // if ($i!=0) если количество найденых свойст не равно 0 if ($i!=0){ $analog_count_id[$element['ID']] = $i; } 2.неплохо было при выводе похожих товаров,выводить значения свойств не только по которым мы отбирали похожие товары
Здравствуйте! Не подскажете, в .parameters.php Вы присваиваете значения для $arProperty_N, $arProperty_X и $arProperty_Y, а далее нигде эти массивы не используются. Но зачем они тогда нужны?
Здравствуйте. Дошёл до последнего шага и не понял в какой файл вставлять данный код foreach($arResult["ANALOG"] as $analog): //ваш шаблон endforeach;
А можно ли сие чудо заставить выводиться под каждым товаром в списке товаров категории, например после нажатия на кнопку показать похожие товары По доработке куда писать?
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».