tvSuperSelect фильтрация по двум и более TV
tvSuperSelect фильтрация ресурсов по двум и более TV с логическим «И»
Всем привет!
Встала задача сделать выборку ресурсов по нескольким TV полям типа tvSuperSelect с логическим «И»
Объясню подробнее.
К примеру есть торт.
У торта есть крем и есть вкус.
Крем может быть например:
— Маслянный
— Творожный
— Сливочный
И может быть и Маслянный и Творожный
По этой причине, для удобства контенщиков я выбрал tvSuperSelect
Вкус может быть:
— Ореховый
— Ягодный
— Фруктовый
Для фильтрации тортов используются выпадающие списки.
Имеется сниппет tvssResources
Он умеет фильтровать, но с логическим «ИЛИ»
Выход
— Использовать cниппет pdoResources c параметром WHERE и SQL оператором LIKE
Здесь я наткнулся на несколько подводных камней. В базе tv-ки компонента tvSuperSelect храняться в виде JSON. Как известно, JSON содержит кучу обратных слешей "\"
MySQL не отрабатывает запросы в который в LIKE содержится обратный слеш, т.к это служебный символ
Вот такой запрос работать не будет:
Методом подбора я выяснил, что MySQL проглатывает такой запрос
Дальше выяснилось, что php-шная функция str_replace также отказывается работать с обратным слешем.
Решение оказалось корявым, но зато рабочим
Пусть моё пока останется тут, вдруг кому сгодится.
Всем привет!
Встала задача сделать выборку ресурсов по нескольким 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"])))."%'"));
....
));
Может кто-нибудь предложит более изящное решение? Пусть моё пока останется тут, вдруг кому сгодится.
Комментарии: 2
У пакета дублируются значения в собственную таблицу для удобства фильтрации. Об этом сказано в описании к пакету в Modstore. Вот ссылка на схему.
По этой причине, для удобства контенТщиков я выбрал tvSuperSelectЭто зря, очень скоро появятся Ареховый, Йагодный, Фрухтовый итд вкусы.
Вкус может быть:
— Ореховый
— Ягодный
— Фруктовый
Для фильтрации тортов используются выпадающие списки.Мсье, советую попробовать mFilter2.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.