Решение: В данный момент
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.