Всем привет!
Сегодня, лично для меня, очень и очень важный релиз, а именно компонент конструктора запросов (фильтров). Чтобы сразу было понятно что это за зверь и как он выглядит, перейдите по этой ссылке: https://modxclub.ru/topics?filters=%7B%22CreatedBy%22%3A%7B%22username_not%22%3A%22Fi1osof%22%7D%2C%22Comments_every%22%3A%7B%22CreatedBy%22%3A%7B%22username_not%22%3A%22Fi1osof%22%7D%7D%2C%22Comments_some%22%3A%7B%7D%7D
Не переживайте, там ничего страшного:) Просто сразу выставлены некоторые фильтры, а именно "Получить все топики, созданные не мной, в которых есть хотя бы один комментарий и все комментарии при этом созданы не мной".
А вот так выглядит это условие в формате JSON:
Как видите, запрос довольно таки не простой. И это совсем не предел. Можно, к примеру, в него добавить еще условия: "в блоге Песочница, с тегом pdo и с текстом pdoTools".
Полученный фильтр в формате JSON:
Наверняка многим, кто хоть немного писал какие-либо запросы, понятно что за условия здесь сформированы.
А сейчас я расскажу подробней, почему этот релиз очень важен.
Давайте для начала вспомним, что у нас здесь есть страницы Схема и API (ссылки находятся в главном меню). В Схеме можно в графическом представлении увидеть какие есть типы данных и взаимосвязи с ними. К примеру, объект User (Пользователь) имеет свойства id, username, fullname и т.п., а так же есть связанные с другими объектами свойства, такие как Resources (Документы), Projects (Проекты), Tasks (Задачи) и т.п. В свою очередь Resource помимо прочего имеет свойство type, которое указывает что именно это за Ресурс. http://joxi.ru/Vm6a53MtDy8ylr Для нас сейчас интересны типы Blog, Topic, Comment, так как в нашем запросе, получая топики с прочими фильтрами (блоги, комментарии), мы оперируем и там и там Ресурсами, просто с разными типами. В общем, если понимать Схему, то не сложно будет и понять как правильно писать запросы. Запросы как раз можно писать в выше озвученном API-интерфейсе. К примеру, вот так выглядит относительно простой запрос получение топиков:
Вы можете его выполнить в API-интерфейсе и получите результат: http://joxi.ru/nAyYL6ZSYZlyVA
А теперь давайте добавим немного магии, а именно скопируем полученные условия в формате JSON и передадим их в параметрах в переменной where: http://joxi.ru/ZrJeOj1h9ao3gA
Теперь мы получили те же записи, что и ранее на странице топиков, только без оформления, в чистом виде. То есть у нас здесь единство бэкенда и фронтенда: то, что мы получаем на бэке, то мы получим и во фронте. А главное: все это динамичиское, генерируемое, то есть если я добавлю какие-то новые сущности или их свойства, мне достаточно просто выполнить команду, чтобы перегенерировать API, и у меня будет обновленная Схема, обновленное API и обновленные фильтры.
Вообще я давно хотел такие фильтры, но их реализация - довольно не простая задача. Разработка первичной версии заняла более 20 часов, хотя на выходе менее 500 строчек кода в одном файле. И работа еще не закончена (не весь функционал еще реализован, да и в реализованном есть баги (пока не корректно обрабатываются булевы и числовые поля, не обрабатываются массивы и даты)). Тем не менее то, что уже есть, лично меня очень радует :) В процессе компонент конечно же будет развиваться.
P.S. Вот здесь подробно описано как формируются и выполняются запросы в @prisma-cms: https://modxclub.ru/topics/kak-formiruyutsya-zaprosy-v-@prisma-cms.html
Имейте ввиду, что все запросы стандартизированы и @prisma-cms/filters годится под все типы запросов.
P.P.S. Скоро фильтры появятся и в проектах, и в комментариях, и в пользователях, да и в других местах, где это будет уместно.
Николай, привет! Фактически конструктор подразумевает любые фильтры по всем имеющимся полям? То есть компонент в пивкарту на фильтрацию пива подходит?
Круто!
И наконец-то на сайте можно будет искать информацию :)
Дима, таки да :)
Саша, пока еще далеко не везде фильтры воткнул, но как и написал, буду добавлять.