tvSuperSelect фильтрация по двум и более TV

tvSuperSelect фильтрация ресурсов по двум и более TV с логическим «И»

Всем привет!
Встала задача сделать выборку ресурсов по нескольким TV полям типа tvSuperSelect с логическим «И»

Объясню подробнее.

К примеру есть торт.
У торта есть крем и есть вкус.

Крем может быть например:
— Маслянный
— Творожный
— Сливочный

И может быть и Маслянный и Творожный
По этой причине, для удобства контенщиков я выбрал tvSuperSelect

Вкус может быть:
— Ореховый
— Ягодный
— Фруктовый

Для фильтрации тортов используются выпадающие списки.

Имеется сниппет tvssResources

Он умеет фильтровать, но с логическим «ИЛИ»

{$_modx->runSnippet('pdoPage', [
    'element' => 'tvssResources',
    'tv' => '2,3',
    'tag' => 'Маслянный||Ореховый'
])}
В результате сниппет вернёт все торты с Маслянным кремом и все торты с Ореховым вкусом в куче, а надо только торты с Маслянным кремом и Ореховым вкусом

Выход
— Использовать cниппет pdoResources c параметром WHERE и SQL оператором LIKE

Здесь я наткнулся на несколько подводных камней. В базе tv-ки компонента tvSuperSelect храняться в виде JSON. Как известно, JSON содержит кучу обратных слешей "\"
MySQL не отрабатывает запросы в который в LIKE содержится обратный слеш, т.к это служебный символ

Вот такой запрос работать не будет:

WHERE column LIKE '%"\u041e\u0440\u0435\u0445\u043e"%'
Пришлось извратиться
Методом подбора я выяснил, что MySQL проглатывает такой запрос
WHERE column LIKE '%"\\\\u041e\\\\u0440\\\\u0435\\\\u0445\\\\u043e"%'
Т.е встала задача заменить один \ на 4 \\\\

Дальше выяснилось, что php-шная функция str_replace также отказывается работать с обратным слешем.

Решение оказалось корявым, но зато рабочим

$modx->runSnippet("pdoResources", array(
	....
	$modx->toJSON(array("cream LIKE '%".addslashes(addslashes(json_encode($_POST["cream"])))."%'"));
	....
));
Может кто-нибудь предложит более изящное решение?
Пусть моё пока останется тут, вдруг кому сгодится.
bratskiy
31 мая 2017, 13:42
modx.pro
4
2 090
+4

Комментарии: 2

Павел Гвоздь
01 июня 2017, 00:58
+4
У пакета дублируются значения в собственную таблицу для удобства фильтрации. Об этом сказано в описании к пакету в Modstore. Вот ссылка на схему.
    Антон
    01 июня 2017, 04:11
    -3
    По этой причине, для удобства контенТщиков я выбрал tvSuperSelect

    Вкус может быть:
    — Ореховый
    — Ягодный
    — Фруктовый
    Это зря, очень скоро появятся Ареховый, Йагодный, Фрухтовый итд вкусы.

    Для фильтрации тортов используются выпадающие списки.
    Мсье, советую попробовать mFilter2.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2