Как сделать сложный фильтр по нескольким свойствам?
Добрый день, коллеги! Недавно встал вопрос о доработке умного фильтра битрикс. Суть - раньше фильтр работал стандартно по логике AND.
Т.е. в фильтре как обычно можно было выбрать свойство, к примеру, есть свойства товар (какой товар,сковородка, кастрюля и т.д.), ручка (круглая, длинная) и т.д.
Если покупатель выбирал сковороду, а среди сковородок нет товара со свойством круглая ручка, то в фильтре это свойство(круглая ручка) становилось DISABLED (обработка идет в штатном компоненте smart.filter).
Теперь появилась задача - есть еще 2 свойства, материал товара и материал ручки. Материалы в этих свойствах могут совпадать, и захотелось объединить результат по этим двум свойствам. Т.е. чтобы при выборе, к примеру, чугун, чтобы выбирались и сами чугунные сковородки и сковородки с чугунной ручкой.
Решено было при помощи сложной логики фильтра
"LOGIC" => "OR",
"=PROPERTY_MATERIAL_GOOD" => iron,
"=PROPERTY_MATERIAL_HANDLE" => iron,
Товары фильтруются как надо, однако проверки на DISABLED остальных свойств теперь не отрабатывают. Подскажите, пожалуйста, как сделать так, чтобы товары фильтровались по обоим этим свойствам, но при этом если нет товаров, которые отвечают обоим этим свойствам (чугунный товар, чугунная ручка), к примеру, нет таких кастрюль, чтобы свойство тип товара - кастрюля становилось DISABLED.
PetrPo, да, логика должна быть стандартна по фильтрам. И да пластмассовая сковородка с чугунной ручкой)
Я просто нашла вот эту логику Or и она подходит, просто ощущение что может я не так arfilter формирую и ему чего-то не хватает.
PetrPo, Кажется, я поняла где именно. Большое спасибо, как всегда направили в нужном направлении, до моих преобразований массив меняли еще в одном месте, когда я поставила свою логику перед этими изменениями, все заработало) Можете в ответ вывести решение про глобальный массив, я отмечу?
Анна, думаю что все не так просто) скорее всего сейчас некоторые свойства в фильтре стали недоступны для выбора (DISABLED), хотя по логике должны быть доступны. Сложно на пальцах объяснить, но попробую:
- вот здесь стандартная логика фильтра, выбран чугун у 2-х свойств и поскольку найдено 0 товаров, то например все значения свойства "Цвет" - disabled - все правильно
- здесь изменена логика, как у тебя и поскольку логика ИЛИ, то найдено 2 товара - у одного ручка чугун, у другого материал - чугун
но также у них обоих цвет - белый и он должен быть доступен для выбора, а он все равно disabled
У тебя такая же ситуация возникла и думаю тут только кастомизировать сам фильтр и это по всей видимости весьма нетривиальная задача, посмотрю попозже, но не уверен что смогу найти решение((
PetrPo, Нет, все таки прошу прощения но это не сработало( Нормально отображает, только если есть либо свойство ручка чугун, при этом нет такого материала товара, либо наоборот. Т.е. если материал встречается только 1 раз только в одном свойстве. В остальных случаях некорректно все равно отрабатывает
Анна, как успехи?)
Подскажи, вот есть у нас 2 свойства, некоторые их значения пересекаются, например чугун, а некоторые нет, как это вообще должно выглядеть?
Стандартно как на скрине выше:
MATERIAL_GOOD
- железо
- чугун
PetrPo, Успехи самописные) Я добавила еще одну проверку в result_modifier. Я получаю массив товаров по нужному фильтру (товары то корректно отображаются) И потом бегу по свойствам в цикле и для каждого свойства проверяю, есть ли в массиве товар с таким свойством. При первом попадании убираю DISABLED из значений и вот оно счастье) Так для всех свойств. Совсем не оптимально, но на небольших массивах отрабатывает быстро.
PetrPo, Собственно, задача решена.
А фильтр я просто связала вместе свойства. Кликаешь на MATERIAL_GOOD и тут же выбирается MATERIAL_HANDLE с тем же значением.