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