Блог Николая Семенцова

Партнер компании 1с-битрикс

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

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

Писать отдельный компонент для этой задачи я не увидел смысла, поэтому кастомизировал текущий , приступим :)
Для начала нам надо дать возможность в комплексном компоненте каталога 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
                            );
                        }
                        if($more_element_img){   }
                            $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

Вот собственно и все:)



Опубликовано: 29 мая 2012




Помогла заметка? Жмите кнопки ниже


ВКонтакт Facebook Google Plus Одноклассники Twitter Livejournal Liveinternet Mail.Ru





comments powered by Disqus