Битрикс не работает умный фильтр с чпу

Почему в Битриксе не работает smart filter?

Столкнулся с проблемой: перестал работать смарт-фильтр каталога Битрикс (ajax-запрос возвращает пустой ответ, см. скриншот)
То есть после прощёлкивания опций/ ползунков фильтра происходит запрос к ajax, но не отрисовывается всплывающая подсказка «Выбрано 12» рядом с фильтром. Также после нажатия кнопки «Применить» ничего не происходит.

Пробовал менять флаг «AJAX_FILTER_CATALOG» и на «N», и на » Y», перетирал кэш, перестраивал фасетный индекс — ничего не помогло.
Даже обращался к инструкции https://aspro.ru/kb/article/33/ — тоже безрезультатно.

Фрагмент настроек модуля «Каталог» /catalog/index.php

Подскажите, куда смотреть? Возможно, что-то с ajax-обработчиком (не могу найти сам файл-обработчик)

  • Вопрос задан 28 нояб. 2020
  • 527 просмотров

происходит запрос к ajax, но не отрисовывается всплывающая подсказка «Выбрано 12» рядом с фильтром.

Ну так при ajax она и не должна отрисовываться

Пробовал менять флаг «AJAX_FILTER_CATALOG» и на «N», и на » Y»

Ни о чем не говорт, нестандартный параметр, обращайся к разработчикам этого костыля

Возможно, что-то с ajax-обработчиком (не могу найти сам файл-обработчик)

Сам обработчик в js файле шаблона, стандартно другх вариантов я не вижу. Но судя по параметру AJAX_FILTER_CATALOG, все может быть, я не экстрасенс. чтобы знать где у тебя обработчик

Для правильной работы фильтра в ajax режиме, должны быть указаны 2 параметра

Источник

ЧПУ для умного фильтра в .htaccess

Доброго времени суток!
Кто-нибудь из форумчан может помочь с правилом для .htaccess?

Мне нужно при запросе site.ru/catalog/?arrFilter_18_MIN=&arrFilter_18_MAX=&arrFilter_711_3163876399=Y&arrFilter_38_MIN=&arrFilter_38_MAX=&arrFilter_40_MIN=&arrFilter_40_MAX=&set_filter=Показать
открывалась страница фильтра, но в урл был ЧПУ — site.ru/catalog/sale_flats/roshino

В обратную сторону я сделал

Цитата
Евгений Кутепов написал:
На странице (или в шаблоне компонента, что вызывается на этой странице) сделать

Добрался до правил обработки адресов и массива $arUrlRewrite. Это то что мне нужно — обращается к скрипту, по выставленному через регулярку URI.

Возьмём мой рабочий URI — /catalog/sale_flats/
Здесь sale_flats — это SECTION_CODE, которых ещё несколько — sale_townhouses например.
Шаблон каталога переопределён на objects

Как сделать правило для моего случая с кастомным компонентом, ума не приложу.

$arUrlRewrite = array(
array(
«CONDITION» => «#^/catalog/#SECTION_CODE#/дальше что писать не понимаю»,
«RULE» => «»,
«ID» => «custom_namespace:custom_component_name»,
«PATH» => «/catalog/section.php»,
),
);

Забил на обработку адресов, написал правило в .htaccess

RewriteRule ^(.*)/(.*)/roshino$ /$1/$2/?arrFilter_18_MIN=&arrFilter_18_MAX=&arrFilter_711_2854278298=Y&arrFilter_38_MIN=&arrFilter_38_MAX=&arrFilter_40_MIN=&arrFilter_40_MAX=&set_filter=%D0%9F%D0%BE%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C [P]

Тут мой чайник вскипел.
Если пишу [P] — идёт редирект куда надо, но URI меняется
Если пишу [L] — URI нужный,остаётся в адресной строке, но редиректит в catalog.section.list или в catalog/index.php не могу понять.
Помогите кто-нибудь — второй день бьюсь.

Я тоже долго всматривался и искал смысл и обход сразу бросающихся багов.
Во первых для индексации сайта вредно индексировать результаты фильтров. Там есть множество нюансов, а при большом каталоге нагрузка.

Если вам нужны подборки готовых фильтров под запрос то проще в разделе где выводится каталог создать нужный подраздел (или вообще отдельно в структуре) где вывести заранее собранные по фильтру позиции.
Например как сделано тут: http://www.keramika-bazar.ru/keramogranit-dlya-lodzhi-i-balkona/?sort=price&order=asc

Вы можете и нужное СЕО сделать и товары из подборки получите.

Есть еще вариант воспользоваться решением готовым, которое может сразу все ваши будущие проблемы перекрыть ( https://marketplace.1c-bitrix.ru/solutions/itlogic.seofilter/ ) не знаю, правда, на сколько он сейчас работает хорошо, не пробовал.

Цитата
Евгений Кутепов написал:

Если вам нужны подборки готовых фильтров под запрос то проще в разделе где выводится каталог создать нужный подраздел (или вообще отдельно в структуре) где вывести заранее собранные по фильтру позиции.

Цитата
Евгений Кутепов написал:

Если вам нужны подборки готовых фильтров под запрос то проще в разделе где выводится каталог создать нужный подраздел (или вообще отдельно в структуре) где вывести заранее собранные по фильтру позиции.

Большое спасибо! Быть может кто-нибудь подскажет — есть ли функция создания административных разделов программно, через API?
Так как не очень хочется руками создавать разделы под 250 улиц города например или 30 под населённые пункты.

Цитата
Евгений Кутепов написал:
Задачу в студию!Зачем вообще надо создавать АДМИНИСТРАТИВНЫЕ разделы под 250 улиц или городов?

Я это понимаю целиком и полностью. Но мне кажется, что моя задача реализуема. Мне просто не хватает знаний или я уже устал от неё.
Возьмём класс компонента.
Вот несколько функций которые отвечают за создание SEF URI, его кодирование и распознавание.

public function searchProperty($items, $lookupValue)
<
foreach($items as $itemId => $arItem)
<
if (!$arItem[«PRICE»])
<
$code = toLower($arItem[«CODE»]);
if ($lookupValue === $code)
return $itemId;
if ($lookupValue == intval($arItem[«ID»]))
return $itemId;
>
>
return false;
>

public function searchValue($item, $lookupValue)
<
foreach($item as $itemId => $arValue)
<
if ($lookupValue === $arValue[«URL_ID»])
return $itemId;
>
return false;
>

public function convertUrlToCheck($url)
<
$result = array();
$smartParts = explode(«/», $url);
foreach ($smartParts as $smartPart)
<
$item = false;
$smartPart = preg_split(«/-(from|to|is|or)-/», $smartPart, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($smartPart as $i => $smartElement)
<
if ($i == 0)
<
if (preg_match(«/^price-(.+)$/», $smartElement, $match))
$itemId = $this->searchPrice($this->arResult[«ITEMS»], $match[1]);
else
$itemId = $this->searchProperty($this->arResult[«ITEMS»], $smartElement);

if ($itemId)
$item = &$this->arResult[«ITEMS»][$itemId];
else
break;
>
elseif ($smartElement === «from»)
<
$result[$item[«VALUES»][«MIN»][«CONTROL_NAME»]] = $smartPart[$i+1];
>
elseif ($smartElement === «to»)
<
$result[$item[«VALUES»][«MAX»][«CONTROL_NAME»]] = $smartPart[$i+1];
>
elseif ($smartElement === «is» || $smartElement === «or»)
<
$valueId = $this->searchValue($item[«VALUES»], $smartPart[$i+1]);
if (strlen($valueId))
<
$result[$item[«VALUES»][$valueId][«CONTROL_NAME»]] = $item[«VALUES»][$valueId][«HTML_VALUE»];
>
>

public function makeSmartUrl($url, $apply, $checkedControlId = false)
<
$smartParts = array();

if ($apply)
<
foreach($this->arResult[«ITEMS»] as $PID => $arItem)
<
$smartPart = array();
//Prices
if ($arItem[«PRICE»])
<
if ($arItem[«VALUES»][«MIN»][«HTML_VALUE»] || $arItem[«VALUES»][«MAX»][«HTML_VALUE»])
<
if ($arItem[«VALUES»][«MIN»][«HTML_VALUE»])
$smartPart[«from»] = $arItem[«VALUES»][«MIN»][«HTML_VALUE»];
if ($arItem[«VALUES»][«MAX»][«HTML_VALUE»])
$smartPart[«to»] = $arItem[«VALUES»][«MAX»][«HTML_VALUE»];
>
>

if ($smartPart)
<
array_unshift($smartPart, toLower(«price-«.$arItem[«CODE»]));
$smartParts[] = $smartPart;
>

>

foreach($this->arResult[«ITEMS»] as $PID => $arItem)
<
$smartPart = array();
if ($arItem[«PRICE»])
continue;

if ($smartPart)
<
if ($arItem[«CODE»])
array_unshift($smartPart, toLower($arItem[«CODE»]));
else
array_unshift($smartPart, $arItem[«ID»]);

if (!$smartParts)
$smartParts[] = array(«clear»);

return str_replace(«#SMART_FILTER_PATH#», implode(«/», $this->encodeSmartParts($smartParts)), $url);
>

public function encodeSmartParts($smartParts)
< foreach ($smartParts as &$smartPart)
<
$urlPart = «»;
foreach ($smartPart as $i => $smartElement)
< if (!$urlPart) <
$urlPart .= urlencode($smartElement);
>
elseif ($i == ‘from’ || $i == ‘to’) <
$urlPart .= urlencode(‘-‘.$i.’-‘.$smartElement);
>
elseif ($i == 1) <
$urlPart .= urlencode(‘-is-‘.$smartElement);
>
else <
$urlPart .= urlencode(‘-or-‘.$smartElement);
>
>
$smartPart = $urlPart;
>
unset($smartPart);
return $smartParts;
>

Если вы посмотрите на последнюю функцию — то это именно то место, где всё собирается, а функции выше выполняют остальную работу.

Источник

Обновление 15.0.6 Не работает Умный Фильтр! Внимание.

Цитата
Виталий Черепанов написал:
у меня все работает, вчера вечером обновления ставил.

Поясняю всем! Если обновиться и просто поставить магазин то фильтр умный работает! Но если создать на странице самому фильтр, то он не видит свойств!
Это стандартный обновленный магазин и в нем показывает. Но если вставить фильтр самому, то он не работает!


Как видите, свойства отсутствуют. До обновления такого небыло! Настройки фильтра вот —

Цитата
Виталий Черепанов написал:
в настройках catalog.section нет настройки использования УМНОГО фильтра.

Но есть компонент «Умный фильтр», который до обновления отлично работал рядом с catalog.section

Насколько я понял, Татьяна именно о таком случае говорит.
У меня такая же ситуация.

Татьяна Здоровье, на Ваших скриншотах видно следующее:
1. Используется ЧПУ по символьным кодам разделов.
2. В настройках компонента bitrix:catalog.smart.filter указано, что передается ID текущего раздела инфоблока из переменной $_REQUEST[‘SECTION_ID’]
3. СИМВОЛЬНЫЙ КОД текущего раздела инфоблока задан пустым.

Если перед вызовом bitrix:catalog.smart.filter Вы сами не заполняете $_REQUEST[‘SECTION_ID’] данными на основе адреса текущего раздела, то компонент и не должен работать. В комплексном bitrix:catalog эти действия выполняются в самом компоненте. Вам нужно либо получать ID раздела, либо из адреса текущего раздела получать символьный код и передавать в bitrix:catalog.smart.filter

Цитата
Сергей Минаев написал:
Ковыряю до сих пор, НЕ работает! Написал в тех поддержку, надеюсь помогут.

Цитата
Юрий Зюзин написал:
кнопка купить перестала работать.
Цитата
Татьяна Здоровье написал:
Умный фильтр + Элементы без категорий = НЕ РАБОТАЕТ.

Подтверждаю, на нескольких сайтах используется фильтр в каталогах БЕЗ разделов.
Ранее если в умный фильтр не передавали ID раздела то он прекрасно работал
С версии 15.0.6 стал обязательным к передаче в компонент ID или CODE
Как решить проблему не понятно, у нас просто нечего передавать, так как разделов нет.

На других сайтах использовался умный фильтр для фильтрации всего каталога, без привязки к разделам, т.е. опять мы ранее не пердавали ID. Эти сайты после обновления также не работают.

На сайтах, на которых прежде чем использовать фильтр передается ID все работает как и раньше.
Решение не обновлять сайты — не считаю решением. Также нет решения, что делать в каталогах без разделов, в которых использовался фильтр для подбора элементов.

Источник

Умный фильтр (bitrix:catalog.smart.filter) — поддержка работы в корне каталога (без указания раздела)

Умный фильтр (bitrix:catalog.smart.filter) — поддержка работы в корне каталога (без указания раздела)

Срочно нужно! Суть проблемы в том, что если мы находимся в корне инфоблока (не зашли в раздел) то во всплывашке:

всегда будет ошибочно писаться что товаров НЕ найдено.

подскажите пожалуйста, если не сложно, какие параметры у вас для случая если разделы есть? интересует именно — используете ли SHOW_ALL_WO_SECTION, BY_LINK ?
SMART_FILTER_PATH каким указывать для параметров комплексного компонента?
сейчас у меня #SECTION_CODE_PATH#/filter/#SMART_FILTER_PATH#/apply/
при этом выходит 404 ошибка, и никак не могу победить..

«SHOW_ALL_WO_SECTION» => «Y»,
BY_LINK не передаю

но вам думаю стоит поставить и потестить
«SET_STATUS_404» => «N»,
«SHOW_404» => «N»,

Чтобы работало в корне с включенным ЧПУ в комплексном каталоге
в sections.php до вызова умного фильтра добавить
if(empty($arResult[«VARIABLES»][«SMART_FILTER_PATH»])) <
$re = ‘/^\/.*\/filter\/(.*)\/apply\//’;
$str = Bitrix\Main\Context::getCurrent()->getRequest()->getRequestedPage();
preg_match($re, $str, $matches);
$arResult[«VARIABLES»][«SMART_FILTER_PATH»] =$matches[1];
>

ну а в вызове умного фильтра
«SMART_FILTER_PATH» => $arResult[«VARIABLES»][«SMART_FILTER_PATH»]

В компоненте bitrix:catalog.smart.filter меняем параметр «SECTION_ID» с $arCurSection[‘ID’] на
«SECTION_ID» => $arResult[«VARIABLES»][«SECTION_ID»].

Дело в том, что если раздел корневой, то $arCurSection[‘ID’] возвращает первый попавшийся раздел. Поэтому в фильтре свойства из одного раздела.

У меня не работает умный фильтр в корне, что я делаю не так?

1. Добавляем «SHOW_ALL_WO_SECTION» => «Y» в настройки компонента catalog.smart.filter и catalog.section.
2. В настройках комплексного компонента каталога в параметре SEF_URL_TEMPLATES переопределяем «sections» => «filter/#SMART_FILTER_PATH#/apply/».

Итого, умный фильтр работает в корне каталога с ЧПУ.
Во всплывающем окне будет корректное кол-во отфильтрованных товаров в разрезе всего каталога.

Тестировал как мог — ошибок не нашел.

Версия битрикс — 17.5.13

Есть у кого пример сайта с настроенным фильтром в корне? А то совет из последнего комментария не помог.

Версия битрикс тоже 17.5.13

Работа каталога и умного фильтра с ЧПУ в корне каталога

Решил выписать как делать в виде одного комментария, чтобы было удобней:

1. Ставим и настраиваем комплексный компонент bitrix:catalog

a. Управление адресами страниц

— Каталог ЧПУ (относительно корня сайта): /catalog/
— Список разделов: (пустое)
— Раздел: (пустое)
— Детальная информация: #ELEMENT_CODE#/
— Url раздела для умного фильтра: #SECTION_CODE#/filter/#SMART_FILTER_PATH#/apply/

b. Важно поставить «SET_STATUS_404» => «N», чтобы не отлавливать 404 при повторной фильтрации.

Проблема описана здесь https://toster.ru/q/520675 и https://www.youtube.com/watch?v=14VdzaZkoNo&feature=youtu.be (выше в комментариях про это есть)

2. Копируем шаблон компонента и делаем корректировки по страницам

Удаляем все и подключаем

1) Удаляем все и ставим последовательно:

2) Копируем из section_horizontal.php или section_vertical.php

Добавляем в настройки компонента
«SHOW_ALL_WO_SECTION»=>»Y»,

Меняем в настройках компонента
«SECTION_ID»=>0,
«SEF_RULE»=>»/catalog/filter/#SMART_FILTER_PATH#/apply/»

bitrix:catalog.section
Добавляем в настройки компонента
«SHOW_ALL_WO_SECTION»=>»Y»

Также после выше указанных настроек была обнаружена проблема на версии 18.1.5.
В комментариях её не встречал, поэтому опишу проблему и решение.

Проблема:
Фильтруем товары по cheackbox.
Есть свойство, которое после фильтрации показывает ноль, то к label добавляет disabled, а к input атрибут disabled, чтобы нельзя было выбрать нулевой вариант выборки товаров.
Если снять, например, cheackbox, который был до этого выбран, то для свойства с нулевым вариантом появятся изначальные варианты до фильтрации, но они будут disabled — выбрать их нельзя .

Источник

Читайте также:  Как настроить сигнализацию fighter
Оцените статью