Николай Ланец
10 мар. 2019 г., 6:49

MODX-Клуб 2.14.0 Фильтры by @prisma-cms/filters

Всем привет!

Сегодня, лично для меня, очень и очень важный релиз, а именно компонент конструктора запросов (фильтров). Чтобы сразу было понятно что это за зверь и как он выглядит, перейдите по этой ссылке: 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:
{ "CreatedBy": { "username_not": "Fi1osof" }, "Comments_every": { "CreatedBy": { "username_not": "Fi1osof" } }, "Comments_some": {} }
Как видите, запрос довольно таки не простой. И это совсем не предел. Можно, к примеру, в него добавить еще условия: "в блоге Песочница, с тегом pdo и с текстом pdoTools".


Полученный фильтр в формате JSON:
{ "CreatedBy": { "username_not": "Fi1osof" }, "Comments_every": { "CreatedBy": { "username_not": "Fi1osof" } }, "Comments_some": {}, "Blog": { "name": "песочница" }, "Tags_some": { "Tag": { "name_contains": "pdo" } }, "contentText_contains": "pdoTools" }
Наверняка многим, кто хоть немного писал какие-либо запросы, понятно что за условия здесь сформированы.

А сейчас я расскажу подробней, почему этот релиз очень важен.

Давайте для начала вспомним, что у нас здесь есть страницы Схема и API (ссылки находятся в главном меню). В Схеме можно в графическом представлении увидеть какие есть типы данных и взаимосвязи с ними. К примеру, объект User (Пользователь) имеет свойства id, username, fullname и т.п., а так же есть связанные с другими объектами свойства, такие как Resources (Документы), Projects (Проекты), Tasks (Задачи) и т.п. В свою очередь Resource помимо прочего имеет свойство type, которое указывает что именно это за Ресурс. http://joxi.ru/Vm6a53MtDy8ylr Для нас сейчас интересны типы Blog, Topic, Comment, так как в нашем запросе, получая топики с прочими фильтрами (блоги, комментарии), мы оперируем и там и там Ресурсами, просто с разными типами. В общем, если понимать Схему, то не сложно будет и понять как правильно писать запросы. Запросы как раз можно писать в выше озвученном API-интерфейсе. К примеру, вот так выглядит относительно простой запрос получение топиков:
query topics ( $where: ResourceWhereInput = {} ){ resourcesConnection( first: 5 orderBy: createdAt_DESC where:{ type: Topic AND: [$where] } ){ aggregate{ count } edges{ node{ id name uri CreatedBy{ id username } } } } }
Вы можете его выполнить в 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. Скоро фильтры появятся и в проектах, и в комментариях, и в пользователях, да и в других местах, где это будет уместно.
Николай, привет! Фактически конструктор подразумевает любые фильтры по всем имеющимся полям? То есть компонент в пивкарту на фильтрацию пива подходит?
Круто!
И наконец-то на сайте можно будет искать информацию :)
Саша, пока еще далеко не везде фильтры воткнул, но как и написал, буду добавлять.

Добавить комментарий