При создании магазина столкнулся с такой интересной задачей, в карточке товара необходимо было сделать вывод похожих товаров. Похожесть товаров определялась так , товар должен был быть из такой же категории, инфоблока и так же у него должно совпадать максимальное количество свойств с товаром в карточке которого мы находимся. Писать отдельный компонент для этой задачи я не увидел смысла, поэтому кастомизировал текущий , приступим Для начала нам надо дать возможность в комплексном компоненте каталога 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;
В карточке товара выводится только ЭЛЕМЕНТ НЕ НАЙДЕН! Поясните пожалуйста как сделать?
"DETAIL_PROPS_ANALOG" => $arParams["DETAIL_PROPS_ANALOG"], - добавляем в <?$ElementID=$APPLICATION->IncludeComponent( файл element.php
далее в шаблон карточки товара template.php <? foreach($arResult["ANALOG"] as $analog): ?> //ваш шаблон (тут что? на примере можно кратком?) <? endforeach; ?>
все остальное по файлам как тут в инструкции. но выводит надпись Элемент не найден. что не так? Я хочу выводить в карточке товара (Кухня МАРГАРИТА - поле в товаре Серия: Маргарита) отдельные модули для кухни, модули выводятся относительно поля СЕРИЯ, Ваш метод я так понял это и реализует, но на выходе ошибка. поправьте меня что я не так делаю
В (/bitrix/components/bitrix/catalog) в файл parameters.php добавил первый код.
далее в шаблоне в element.php вставил "DETAIL_PROPS_ANALOG" => $arParams["DETAIL_PROPS_ANALOG"],
В шаблоне в result_modifier (/bitrix/templates/eurokorpus/components/bitrix/catalog/collections/bitrix/catalog.element/.default вставил третий кусок кода
и в сам шаблон вставил
<?foreach($arResult["ANALOG"] as $analog):?>
<pre><? print_r($arResult["ANALOG"]); ?></pre>
<?endforeach;?>
Специально для решения этой задачи а также более интересной был создан компонент "Похожие товары - как инструмент увеличения среднего чека" http://marketplace.1c-bitrix.ru/solut...it.analog/ , пробуйте
что то не понятно.... если у меня по вашим адресам ничего нет дефоултного, куда мне тогда вставлять код? О.о а если для карточки товара у меня уже подготовлен шаблон детального просмотра, как же мне тогда поступать?
Здравствуйте, разбираюсь с Вашей доработкой. Интересная реализация. У меня задачка, сделать вывод по определенному свойству - назначение или по категории. Сейчас вывод стоит по товарам из той же категории. По Вашему гайду. Пробовал добавить, может не туда добавляю, посоветуйте.
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С-Битрикс».