Большинство наших клиентов просят переделать шаблон страницы поиска таким образом, чтобы он соответствовал шаблону каталога. При этом не составляет большого труда переделать сам вывод - легко получить все поля элемента каталога по ITEM_ID каждого элемента выходного массива поиска ($arResult['ITEMS'] и исправить шаблон в соответствии с шаблоном витрины (раздела каталога). Проблемы возникают, когда просят при этом реализовать также сортировку (например, по цене) и "умный" фильтр. Про фильтр - отдельная история, здесь же опишу простой подход, который позволяет выводить результаты поиска в нужном нам порядке, т.е. с правильной сортировкой.
[spoiler]
Идея
Есть событие
Реализация
В файле init.php добавим обработчик, который вызывается перед индексацией элемента каталога:
AddEventHandler("search", "BeforeIndex", "BeforeIndexHandler"); function BeforeIndexHandler($arFields) { if($arFields["MODULE_ID"] == "iblock" && $arFields["ITEM_ID"]) { CModule::IncludeModule('catalog'); $arProduct = CCatalogProduct::GetByID($arFields["ITEM_ID"]); if($arProduct['QUANTITY'] <= 0) $k = 1; else $k = $arProduct['QUANTITY'] * 100; $dbPrice = CPrice::GetList(array(),array("PRODUCT_ID" => $arFields["ITEM_ID"],"CATALOG_GROUP_ID" => 2)); $arPrice = $dbPrice->Fetch(); $arFields['CUSTOM_RANK'] = $k * round(10000000/$arPrice['PRICE']); } return $arFields; } |
Итоговый вес для индексации - задаем прямо пропорциональным полученному коэффициенту и обратно пропорциональным цене товара.