Компонент для манипуляции фильтрацией и сортировкой в датасетах.

+32
1.69K
Давно хотел предложить на гитхабе немного расширить возможности сортировки и фильтрации в датасетах.
То есть дать продвинутым администраторам сайта самим создавать нужные фильтры и сортировки для датасетов, путем прописывания mysql в настройках набора в админке, а не выбирать из предложенных вариантов.
Но потом подумал, что разработчики не станут вводить это в коробку, так как этот функционал придется поддерживать и каким-то образом разъяснять пользователям, как им пользоваться. А кому это нужно, учить людей извращениям.
Но, после этой темы на форуме, я увидел, что такой функционал может быть востребован у людей, разбирающихся в mysql.
Поэтому решил сделать маленькое дополнение, состоящее из двух хуков, которое позволяет прямо из админки прописывать сложносочиненные фильтры и сортировки датасетов.
Первый хук изменяет форму настройки датасетов в админке. Второй добавляет эти нестандартные фильтры и сортировки в модель при получении списка типа контента в наборе.
Ни один системный файл не подвергался правке.

После установки данного компонента появляется в админке возможность написать свой запрос mysql в настройках датасетов.
Пример:
Мы хотим в датасете получить контент с датой публикации только за сегодняшний день (а не за прошедшие сутки) с сортировкой по никнейму автора.
Создаем новый набор и там прописываем в настройках нужную сортировку и фильтрацию:

Иллюстрация

В результате получаем вполне нормальный запрос mysql:

  1. SELECT i.*, u.nickname AS `user_nickname`, u.avatar AS `user_avatar`, u.groups AS `user_groups`, f.title AS `folder_title`
  2. FROM cms_con_news i
  3. FORCE INDEX FOR ORDER BY (dataset_curdate)
  4. INNER JOIN cms_users AS u ON u.id = i.user_id
  5. LEFT JOIN cms_content_folders AS f ON f.id = i.folder_id
  6. WHERE (date_pub = CURDATE()) AND (i.is_approved = '1') AND (i.is_deleted IS NULL) AND (i.is_pub = '1') AND (i.is_parent_hidden IS NULL)
  7. ORDER BY u.nickname DESC
  8. LIMIT 0, 15
Сразу предупреждаю, пользоваться этим дополнением смогут только люди, понимающие, что они делают!
Никакие претензии по поводу "я что-то там написал, а теперь что-то не работает" не принимаются.
Это инструмент, а не готовый функционал!

UPDATE
Немного доработал возможности манипуляции сортировкой. Теперь возможны самые сложносочиненные сортировки для джентльменов, знающих толк в извращениях.
Пример:
Мы хотим получить статьи со свежими комментариями, отсортированными по свежести комментариев.
Пишем в my sotring строку (select date_pub from cms_comments where target_id = i.id group by date_pub) desc
Получаем запрос для выборки:
  1. SELECT i.*, u.nickname AS `user_nickname`, u.avatar AS `user_avatar`, u.groups AS `user_groups`, f.title AS `folder_title`
  2. FROM cms_con_articles i
  3. FORCE INDEX FOR ORDER BY (dataset_fresh)
  4. INNER JOIN cms_users AS u ON u.id = i.user_id
  5. LEFT JOIN cms_content_folders AS f ON f.id = i.folder_id
  6. WHERE (i.is_approved = '1') AND (i.is_deleted IS NULL) AND (i.is_pub = '1') AND (i.is_parent_hidden IS NULL)
  7. ORDER BY (SELECT date_pub FROM cms_comments WHERE target_id = i.id GROUP BY date_pub) DESC
  8. LIMIT 0, 15
Выглядит страшно, но работает!

Установка дополнения стандартным способом из админки.

Скачать дополнение

Отключение — удалить папку \system\controllers\datasethook\ и обновить события в админке.
+5
Red-Ray.Ru Red-Ray.Ru 4 года назад #
Отличное решение! Спасибо Ris!
-1
Abobo Abobo 4 года назад #
ну... такое
0
Def Def 4 года назад #
фильтрация по свойствам возможна ? или только по полям?
+1
Ris Ris 4 года назад #
Возможна.
+1
DeDja DeDja 4 года назад #
Спасибо Ris.

Еще от автора

Сверхлёгкий webserver на Alpine linux
Не знаю, как нормальных людей, но меня всё время мучает вопрос, зачем для размещения небольшого сайта на виртуальном сервере я вынужден устанавливать
Накрутка рейтинга и кармы пользователям, контенту и фото.
По многочисленным просьбам изготовил новый инструмент для изменения администратором сайта рейтинга и кармы пользователей.
Авторизация по любым полям из профиля и по API
Представляю уважаемому сообществу небольшое дополнение для доработки авторизации вашего сайта, а также для интеграции двух сайтов на Instantcms друг с
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.