webber12 / eFilter

Фильтрация ресурсов по TV. MODxEvo
16 stars 17 forks source link

Лишние результаты в выдаче #28

Closed mnoskov closed 6 years ago

mnoskov commented 6 years ago

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

В фильтре же я вывожу этот параметр как множественный.

Но при его выборе в выдачу попадают товары, которые не связаны с ним, с одной закономерностью - 4, 14, 24 и т.д. Т.е. если выбрали идентификатор 4 - то попадут все товары с идентификатором, в котором есть цифра 4.

После того, как я закомментировал указанный участок кода, все заработало как надо.

https://github.com/webber12/eFilter/blob/dd15d08e0aa935e010fafb6b67ff512bc1411af3/assets/snippets/eFilter/eFilter.class.php#L745-L747

webber12 commented 6 years ago

Если у товара может быть только одно значение, то и птичку "множественное" ставить не нужно. Соответственно, не пришлось бы и комментировать тот кусок кода :) Т.е. "множественный" это не для вывода в фильтре (там всегда выводятся все значения), а для ввода в админке (например, чекбоксами несколько значений присваивается и пишется в базу через || )

mnoskov commented 6 years ago

Т.е. чтобы можно было выбрать несколько вариантов, достаточно просто поставить тип - Чекбокс?

webber12 commented 6 years ago

Да, при типе чекбокс в любом случае можно выбрать несколько вариантов. Множественный тут ни при чем - это касается именно количества значений параметра у самого товара, т.е. в нашем случае записи в базу вида "раз||два||три". Не так давно предлагал в доклистер еще один тип фильтра https://github.com/AgelxNash/DocLister/issues/292 , который решил бы данную проблему и для множественных тв, но его не приняли по неизвестным для меня причинам.

mnoskov commented 6 years ago

Спасибо!

Насчет нового фильтра, еще такой вариант возможен:

SELECT * FROM modx_site_tmplvar_contentvalues WHERE CONCAT('||', value, '||') LIKE '%||197||%'
webber12 commented 6 years ago

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