konratnox
1/26/2016 - 2:46 PM

Глобальный фильтр + умный фильтр

Глобальный фильтр + умный фильтр

В данный момент bitrix.catalog.smart.filter использует фасетный индекс для построения вариантов доступных свойств для фильтрации. И не воспринимает настройки глобального фильтра каталога.

###Но это можно исправить следующим образом: Копируем компонент catalog.smart.filter в свою директорию /bitrix/components/

В скопированном компоненте есть файл class.php, в этом файле у класса CBitrixCatalogSmartFilter есть метод executeComponent(), в котором происходит вызов экземпляра класса Facet

Код

$this->facet = new Facet($this->IBLOCK_ID);

Заменяем данную стоку следующей:

Код

$this->facet = new FacetMod($this->IBLOCK_ID);

Наша задача - изменить в этом классе Facet(), его метод query(). Для этого я в файле /bitrix/php_interface/init.php описываю свой класс FacetMod(), унаследовав его от Facet()

Код

class FacetMod extends \Bitrix\Iblock\PropertyIndex\Facet {

}

После этого нам надо в него скопировать весь метод query() с класса Facet(). Сам класс описан в файле /bitrix/modules/iblock/lib/propertyindex/facet.php

В самом начале метода query() находим условие

Код

if ($filter) { $filter["IBLOCK_ID"] = $this->iblockId;

$element = new \CIBlockElement; $element->strField = "ID"; $element->getList(array(), $filter, false, false, array("ID")); $elementFrom = $element->sFrom; $elementWhere = $element->sWhere; }

И дополняем его 2 строчками

Код

if ($filter) { $filter["IBLOCK_ID"] = $this->iblockId; //доп.фильтр if(is_array($GLOBALS["arrFilter"])) $filter=array_merge($filter,$GLOBALS["arrFilter"]); $element = new \CIBlockElement; $element->strField = "ID"; $element->getList(array(), $filter, false, false, array("ID")); $elementFrom = $element->sFrom; $elementWhere = $element->sWhere; }

При необходимости можно на основе CIBlockElement::SubQuery() дополнить фильтр по OFFERS (торговым предложениям,характристикам), например, на фильтр по остаткам или наличию цены.

Таким же подходом можно реализовать работу смарт-фильтра в корне каталога, т.е. когда не выбрана нужная категория. По умолчанию фильтр работает при условии, что указан параметр SECTION_ID>0. Если кратко, дополнительно понадобиться изменить метод whereToSql() класса Facet() и правки в components.php.