Иногда хочется чтобы результаты поиска можно было фильтровать, скажем по цене и бренду. Штатный фильтр этой возможности не поддерживает, к сожалению. Но всегда есть выход
По сути ведь нам нужно задать фильтр для фильтра! Следовательно лезем "под капот" битриксу.
Для начала убедитесь, что фасетные индексы для нужного каталога исправно
работают . (Контент->Инфоблоки->Фасетные индексы).
1. Копируем стандартный
сatalog.smart.filter из папки
/bitrix/components/bitrix в свою
/bitrix/components/myFolder. И меняем в файле
class.php вызов нового экземпляра класса
Facet на
MyFacet
$this->facet = new Facet($this->IBLOCK_ID);
|
на
$this->facet = new MyFacet($this->IBLOCK_ID); |
2. В файле
template.php компонента "Поиск по каталогу" подключаем "Умный фильтр":
после определения массива фильтрации для результатов поиска, но
до подключения "Элементов раздела" (
catalog.section).
/*.......*/
if (!empty($arElements) && is_array($arElements))
{ global $searchFilter;
$searchFilter = array(
"=ID" => $arElements,
"SECTION_GLOBAL_ACTIVE" => "Y",
"ACTIVE" => "Y",
"$priceFilterStr" => 0,
);
}
$APPLICATION->IncludeComponent("myFolder:catalog.smart.filter","",
array(..),
);
$APPLICATION->IncludeComponent("bitrix:catalog.section","",
array(..),
);
/*.......*/
|
3. Переопределяем метод
query() класса
Facet() умного фильтра. (не забудьте подключить модуль инфоблоков:
\Bitrix\Main\Loader::includeModule("iblock") )
В файле init.php описываем новый класс MyFacet. Код метода
query() копируем из файла /bitrix/modules/iblock/lib/propertyindex/facet.php
class MyFacet extends \Bitrix\Iblock\PropertyIndex\Facet {
public function query(array $filter, array $facetTypes = array(), $facetId = 0)
{
/*код метода*/
}
} |
4. Добавляем в фильтр глобальный массив
$searchFilter для результатов поиска.
if ($filter) {
$filter["IBLOCK_ID"] = $this->iblockId;
/*Добавляем строки: */
global $searchFilter;
$filter=array_merge($filter,$searchFilter);
/*-- */
$element = new \CIBlockElement;
$element->strField = "ID";
$element->getList(array(), $filter, false, false, array("ID"));
$elementFrom = $element->sFrom;
$elementWhere = $element->sWhere;
} |
Готово! Теперь наш "Умный" фильтр работает и на странице поиска.