Глобальный фильтр + умный фильтр
В данный момент 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.