- Почему в Битриксе не работает smart filter?
- ЧПУ для умного фильтра в .htaccess
- Обновление 15.0.6 Не работает Умный Фильтр! Внимание.
- Умный фильтр (bitrix:catalog.smart.filter) — поддержка работы в корне каталога (без указания раздела)
- Умный фильтр (bitrix:catalog.smart.filter) — поддержка работы в корне каталога (без указания раздела)
Почему в Битриксе не работает 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 — выбрать их нельзя .
Источник