Свой фильтр в mFilter2
Добрый день. Расскажите, пожалуйста, с какой целью используются методы getMyNewValues(array $fields, array $ids), buildMyNewFilter(array $values) и filterMyNew(array $requested, array $values, array $ids) при кастомизации mFilter2. Расковырял компонент, но так и не понял, что должен возвращать каждый из них. Хотя с последним ситуация более менее понятна. Странно, что в модели и сниппете не удается сделать var_dump. Очевидно, данные кешируются. Разъясните, как реализовать фильтр по произвольной таблице.
Комментарии: 10
Спасибо за ответ. Я уже почти всё понял экспериментальным путем. Тем не менее ваша ссылка будет для меня очень полезна.
В данный момент меня интересуют 2 вопроса.
1. Какое имя таблицы использовать при вызове фильтра, если фильтр работает с таблицей стороннего компонента?
2. Я собираюсь фильтровать товары по остаткам конкретной опции. Не станет ли система внутреннего кеширования помехой для отображения актуальной информации в режиме реального времени. Если станет, то как с этим бороться
В данный момент меня интересуют 2 вопроса.
1. Какое имя таблицы использовать при вызове фильтра, если фильтр работает с таблицей стороннего компонента?
2. Я собираюсь фильтровать товары по остаткам конкретной опции. Не станет ли система внутреннего кеширования помехой для отображения актуальной информации в режиме реального времени. Если станет, то как с этим бороться
С самой таблицей работает не mFilter2 (он — обертка результатов), а сниппет в параметр element. Процесс формирования селекторов для кнопок фильтрации — в getNameValues.
modx.pro/howto/8360-filtering-users-using-mfilter2/ — вот пример работы со сторонней таблицей.
Кэш — нет, вряд ли, значение тех или иных полей цепляется непосредственно из бд. (или я не понял ваш вопрос) %)
modx.pro/howto/8360-filtering-users-using-mfilter2/ — вот пример работы со сторонней таблицей.
Кэш — нет, вряд ли, значение тех или иных полей цепляется непосредственно из бд. (или я не понял ваш вопрос) %)
Я использую msProducts, но кастомную таблицу с остатками. Исходя из того, что при вызове фильтра нужно использовать код таблицы, непонятно что туда передавать, когда таблица кастомная. У неё нет кода. Скорее все туда можно передавать любое значение, а таблицу задавать внутри методов.
По ссылке неполный пример. Там реализовано 2 метода из трёх. Если мой фильтр отличается только способом получения значений, я могу определить только метод getMyFilterValues. А для сборки и фильтрации будут использованы buildDefaultFilter и filterDefault. Верно?
К сожалению, пока нет компонента остатков под рукой, поэтому не могу проверить свои гипотезы.
По ссылке неполный пример. Там реализовано 2 метода из трёх. Если мой фильтр отличается только способом получения значений, я могу определить только метод getMyFilterValues. А для сборки и фильтрации будут использованы buildDefaultFilter и filterDefault. Верно?
К сожалению, пока нет компонента остатков под рукой, поэтому не могу проверить свои гипотезы.
Вы можете попробовать присоединить данные таблицы остатков через &leftJoin (только для этого таблицу предварительно потребуется объявить для modx'a, если это не готовый компонент), после чего фильтровать по ней стандартными способами.
Вы опять не поняли) Функционал выбора значений для фильтра реализован. Непонятно, какое имя таблицы указывать при вызове спиппета mFilter. Ладно, вечером у меня будет возможность всё протестировать
Ну… вот как я вижу вашу задачу (поправьте меня если я не прав):
У вас есть товары минишопа (в родной таблице) и данные по остаткам в таблице, созданной вами. Вы хотите подгрузить эти данные непосредственно в вызов mFilter2 к самим товарам, чтобы их можно было использовать в фильтрации. Для этого вам необходимо:
1. Подключить модель своей таблицы в MODX, чтобы можно было обращаться к ней стандартными методами
2. Подцепить ее в вызов mFilter2 через leftJoin и добавить в выборку select:
У вас есть товары минишопа (в родной таблице) и данные по остаткам в таблице, созданной вами. Вы хотите подгрузить эти данные непосредственно в вызов mFilter2 к самим товарам, чтобы их можно было использовать в фильтрации. Для этого вам необходимо:
1. Подключить модель своей таблицы в MODX, чтобы можно было обращаться к ней стандартными методами
2. Подцепить ее в вызов mFilter2 через leftJoin и добавить в выборку select:
[[!mFilter2?
&element=`msProducts`
&class=`msProduct`
&leftJoin=`{
"любой псевдоним для таблицы (например, Remains)": {
"class": "объявленное_название_таблицы_в_MODX'e",
"alias": "Remains",
"on": "Remains.product_id = msProduct.id"
}
}`
&select=`{
"Data": *,
"Remains": "Remains.value as remains"
}`
...
]]
— после этого данные будут корректно цепляться и их можно будет обрабатывать в фильтрации, а также вы сможете в чанке применять плейсхолдер [[+remains]].
А что если таблица совсем кастомная, не ресурсы, и сниппет для их вывода свой собственный? Что нужно mFilter2, чтобы он подцепил результаты из этой таблицы?
Я вроде бы научил сниппет правильно работать с параметрами where, limit, returnIds, sortby и другими. Сниппет прекрасно работает без mFilter2, в том числе и с pdoTools, а через mFilter не желает…
По логам я определил что он передаёт limit 0 независимо от числа, указанного в параметрах сниппета. Откуда он его берет?
Я вроде бы научил сниппет правильно работать с параметрами where, limit, returnIds, sortby и другими. Сниппет прекрасно работает без mFilter2, в том числе и с pdoTools, а через mFilter не желает…
По логам я определил что он передаёт limit 0 независимо от числа, указанного в параметрах сниппета. Откуда он его берет?
Нужно:
1. подключить модель и все параметры вашего сниппета в вызов mFilter2
2. расширить метод фильтрации, чтобы mFilter2 научился фильтровать по вашим таблицам.
1. подключить модель и все параметры вашего сниппета в вызов mFilter2
2. расширить метод фильтрации, чтобы mFilter2 научился фильтровать по вашим таблицам.
2. Я это уже сделал, загвоздка видимо в 1.Я хотел сделать сниппет устойчивым к высоким нагрузкам и просто сделал выборку на SQL, типа этого:
$q = $modx->prepare("SELECT * FROM my_table");
$q->execute();
$r = $q->fetchAll(PDO::FETCH_ASSOC);
Этот вариант не загружает объекты в память и соответственно в разы быстрее и оптимальнее. Но видимо для mFilter2 прийдётся создавать модель таблицы…Спасибо за ответ!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.