Умный фильтр (bitrix:catalog.smart.filter) - выбор между AND и OR для значений каждого свойства и между свойствами!

Рейтинг: 82.1484  
На голосовании
Предложил Пользователь 3308 28.03.2013 12:45:48

Умный фильтр (bitrix:catalog.smart.filter) - выбор между AND и OR для значений каждого свойства и между свойствами!

1. Если я отмечу в одном параметре фильтра значения: "1" и "2", то отфильтруются элементы, в которых имеется хотя-бы одно из выбранных значений параметра, а часто нужно что-бы обязательно присутствовали оба!

2. А вот если я отмечу в разных параметрах фильтра значения: "1" и "2", то наоборот -- отфильтруются элементы, в которых имеется сразу оба из выбранных значений параметров, а часто нужно выбрать товары где есть хотя бы одно!

Рейтинг: -1.2389  
Пользователь 115782 28.03.2013 16:49:04
(не всёПервый пункт странный, поясню:
--------->< ---------
Цвет:
- Красный
- Черный
- Белый
- Металлик
--------->< ---------
Каталог автомобилей, мы выбираем краску и черную и одновременно белую?

Если немного переиначить: нам нужен данный автомобиль или в красном цвете или в белом, тут уже нужно каталог с СКУ (а фильтр по ним в 12.5)



Второе тоже странно. Все(не всё) делают аналгично яндексу.
Рейтинг: 1.2851  
Пользователь 3308 29.03.2013 07:23:19
Гребнев Алексей, да, в вашем примере нужна логика OR, а вот вам другой пример, где  необходима логика AND:
Каталог одежды.
Цвет:
- Красный
- Синий
- Белый

Мы выбираем цвет: и красный и синий и одновременно белый -- потому, что мы  хотим себе футболку под российский триколор! И нас никак не устроит присутствие всего лишь только какого-нибудь одного или даже только двух из перечисленных цветов -- нам строго обязательно нужно присутствие сразу всех 3-х цветов!  

И случаев каталогов с такой необходимостью логики работы фильтра (AND)  так же много как и случаев где  нужно OR.
Рейтинг: -5.7417  
Пользователь 20181 01.04.2013 16:52:04
Было бы не плохо выбирать условия.

Хотя в принципе данную логику можно реализовать к примеру так:
После компонента фильтра написать небольшой кусочек модификации фильтра


<?
   global $$arParams["FILTER_NAME"];
   foreach(${$arParams["FILTER_NAME"]} as $key => &$filter)
   {
      if(strpos($key, 'PROPERTY_....') !== false) {
         echo '<pre>'.print_r($filter, true).'</pre>';
      }
   }
?>
Рейтинг: 1.0634  
Пользователь 3308 27.08.2014 08:58:18
Свежий пример:

Я хочу выбрать на сайте суши, в которых есть и сыр и тунец одновременно!

Ну, что мне толку от выборки суш, в которых есть по одному из ингредиентов, которые я хочу получить В ОДНОМ, в ОДНОМ продукте ЗА РАЗ!  

Скриншот: http://screencast.com/t/dSofWMPZvJD


PS: А потом слышим: "Фильтр Битрикса -- тупой..." :(
Рейтинг: 2.47  
Пользователь 3308 28.08.2014 09:20:54
Сейчас чтобы получить условие "И" нужно каждому ингредиенту создать отдельное свойство:

Шампиньоны
Есть/Нет

Сыр
Есть/Нет

итд

Ну не изврат ли???

Другой кейс -- база данных недвижимости. Свойство -- тип балкона, значения -- лоджия, балкон, веранда итд

Я хочу увидеть все квартиры с лоджией и с балконом одновременно, а "умный фильтр" показывает мне все квартиры где есть хотя бы одно из двух -- "ищи сам...."

Важное замечание: если будет сделана фильтрация по значениям множественного свойства типа список с логикой И, то обязательно нужно "затенять" невозможные значения при выборе одного из них.


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

Случай когда нужна логика "ИЛИ"

Случай когда нужна логика "И"


Это было описание случая для логики И/ИЛИ внутри значений одного параметра. Но, аналогичные же дела обстоят и с логикой И/ИЛИ при фильтрации по разным параметрам фильтра, а не по одному как в приведенных выше скриншотах...
Рейтинг: 0  
Пользователь 283131 15.02.2015 16:52:11
Фильтр на первый взгляд отличный, но работать с ним не возможно. Поэтому вопрос: "Зачем он нужен? Или доработать или в помойку."
Рейтинг: 0  
Пользователь 283131 15.02.2015 16:59:11
За 2 года не доработали фильтр, поэтому вероятность решить вопрос этим методом близка к 0.

Значит нужно менять этот фильтр на другой "рабочий".  
Рейтинг: 0  
Пользователь 258500 03.04.2015 14:58:07
Как пример, можно привести те же редакции битрикс. например, множественное свойство-список "модули". инфоблоки есть везде, а магазин появляется с редакции малый бизнес. в фильтре допустим это чекбоксы. выбираем инфоблоки и магазин и по логике человеческой должны остаться редакции выше малый бизнес, а по логике умного фильтра остаются все редакции, потому что отмечен чекбокс инфоблоки.
Рейтинг: 0.2605  
Пользователь 114664 23.04.2015 14:18:01
А воз и ныне там....
Рейтинг: 0  
Пользователь 4652 02.11.2015 23:28:47
Ещё простейший пример - сайт booking.com.

К примеру вот эта выборка:
http://www.booking.com/searchresults.ru.html?label=gen173nr-15CAEoggJCAlhYSDNiBW5vcmVmaMIBiAEBmAEhuAEEyAEE2AED6AEB&sid=f27e0f326b8b1f8d4a83706f127a0750&dcid=4&c­heckin=2015-11-03&checkout=2015-11-04&city=-2996338&dcsc=2&nflt=hotelfacility%3D11%3Bhotelfacility%3D96%3Bhotelfacility%3D16%3Bhotelfacility%3D2­8%3B

Смотрим свойство "Удобства".
Нам нужен номер с WiFi и утренними завтраками.
Нам не нужен номер где есть одно или другое по отдельности.
Рейтинг: 0.1885  
Пользователь 50984 03.12.2015 11:46:14
Роман подскажите, есть на данный момент какой то костыль для изменения логики?
Рейтинг: 0.1885  
Пользователь 49746 28.07.2016 16:13:56
Прошло 3.5 года - разработчики, АУ!
Рейтинг: 0  
Пользователь 26749 17.08.2017 20:03:04
Ну сделайте уже, важная вещь!  
Рейтинг: 0  
Пользователь 2057583 17.07.2018 12:13:49
Ребят, привет.
Кто делал самостоятельно такую логику в коде? Где хоть копать подскажите?
Рейтинг: 0  
Пользователь 72893 31.08.2018 18:08:52
Сделал преобразование фильтра в логику И таким образом:
         $arNewFilter = array();
         $arSrcFilter = $GLOBALS[$arParams["FILTER_NAME"]];
         foreach($arSrcFilter as $srcFilterID => $srcFilterValue) {
            if(is_array($srcFilterValue)) {
               foreach($srcFilterValue as $thisArValue) {
                  $arNewFilter[] = array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => $arParams["IBLOCK_ID"], $srcFilterID => $thisArValue)));
               }
            } else {
               $arNewFilter[$srcFilterID] = $srcFilterValue;
            }
         }
         $GLOBALS[$arParams["FILTER_NAME"]] = $arNewFilter;
Добавляется в шаблоне (естественно кастомизированном) вывода раздела каталога после компонента catalog.smart.filter, перед catalog.section. У меня это файл section_vertical.php, у других это может быть section_horizontal.php. Файл не кешируется поэтому отрабатывать должен всегда.
Единственное, он переделывает логику на И для всех полей. Если у кого-то есть поля с диапазонами, наверное надо будет еще проверять на наличие символа "=" в начале названия поля. Если нужно сохранить логику ИЛИ для некоторых полей, думаю можно добавить их в параметры компонента и перед преобразованием фильтра проверять на совпадение с этим списком, и не менять если совпало.
Рейтинг: 0  
Пользователь 2090153 16.06.2020 17:28:39
Есть ли новости по этой штуке? например задавать конкретную логику поведения для свойства в фильтре (И, ИЛИ и т.д.)? Без кастомов)
Рейтинг: 0  
Пользователь 537917 10.09.2020 10:30:07
https://dev.1c-bitrix.ru/community/webdev/user/73604/blog/28785/
Вот чел написал код. У меня сработал без изменений.