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

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

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

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

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

Код SQL:
  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 {#}comments where target_id = i.id group by date_pub) desc
Получаем запрос для выборки:
Код SQL:
  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\ и обновить события в админке.
[Неактуально] Информирование пользователей об окончании срока публикации. | Утилита от @fazer для очистки upload.
Комментарии (5)
Red Ray 18 сентября 2019 в 16:18 +5
Отличное решение! Спасибо Ris!
talerbiz 18 сентября 2019 в 18:55 0
ну... такое
Def 30 сентября 2019 в 12:43 0
фильтрация по свойствам возможна ? или только по полям?
Ris 30 сентября 2019 в 16:35 +1
Возможна.
DeDja 30 сентября 2019 в 19:27 +1
Спасибо Ris.