aboutsummaryrefslogtreecommitdiff
path: root/lib/modules/CoreOverview.php
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2025-08-07 10:13:09 +0200
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2025-08-07 10:13:09 +0200
commitb1bc66f361a4dda92aba22fdd42843f619797a6c (patch)
treeecf6a08bddd1230edf7b49fc756073b4071ba169 /lib/modules/CoreOverview.php
parentca3ade956dd9c9041c07cef048136fa91f5faca2 (diff)
implement performance optimizations for my courses, fixes #4693
Closes #4693 Merge request studip/studip!3724
Diffstat (limited to 'lib/modules/CoreOverview.php')
-rw-r--r--lib/modules/CoreOverview.php60
1 files changed, 59 insertions, 1 deletions
diff --git a/lib/modules/CoreOverview.php b/lib/modules/CoreOverview.php
index 7a73be7..5550ed3 100644
--- a/lib/modules/CoreOverview.php
+++ b/lib/modules/CoreOverview.php
@@ -9,7 +9,7 @@
* the License, or (at your option) any later version.
*/
-class CoreOverview extends CorePlugin implements StudipModule
+class CoreOverview extends CorePlugin implements StudipModuleExtended
{
/**
* {@inheritdoc}
@@ -72,6 +72,64 @@ class CoreOverview extends CorePlugin implements StudipModule
return $nav;
}
+ public function getManyIconNavigation(array $course_ids, ?string $user_id = null): array
+ {
+ $sql = "SELECT news_r.range_id,
+ COUNT(news.news_id) AS count,
+ COUNT(IF((news.chdate > IFNULL(b.visitdate, :threshold) AND news.user_id !=:user_id), news.news_id, NULL)) AS neue
+ FROM news_range AS news_r
+ JOIN news
+ ON news_r.news_id = news.news_id
+ AND UNIX_TIMESTAMP() BETWEEN date AND date + expire
+ LEFT JOIN object_user_visits AS b
+ ON b.object_id = news_r.news_id
+ AND b.user_id = :user_id
+ AND b.plugin_id = :plugin_id
+ WHERE news_r.range_id IN (:course_ids)
+ GROUP BY news_r.range_id";
+ $results = DBManager::get()->fetchAll($sql, [
+ ':user_id' => $user_id,
+ ':course_ids' => $course_ids,
+ ':threshold' => object_get_visit_threshold(),
+ ':plugin_id' => $this->getPluginId(),
+ ]);
+
+ $navs = [];
+ foreach ($results as $result) {
+ $nav = new Navigation(_('Ankündigungen'), '');
+ if ($result['neue']) {
+ $nav->setURL('?new_news=true');
+ $nav->setImage(Icon::create('news', Icon::ROLE_ATTENTION));
+ $nav->setLinkAttributes([
+ 'title' => sprintf(
+ ngettext(
+ '%1$d Ankündigung, %2$d neue',
+ '%1$d Ankündigungen, %2$d neue',
+ $result['count']
+ ),
+ $result['count'],
+ $result['neue']
+ )
+ ]);
+ $nav->setBadgeNumber($result['neue']);
+ } elseif ($result['count']) {
+ $nav->setImage(Icon::create('news'));
+ $nav->setLinkAttributes([
+ 'title' => sprintf(
+ ngettext(
+ '%d Ankündigung',
+ '%d Ankündigungen',
+ $result['count']
+ ),
+ $result['count']
+ )
+ ]);
+ }
+ $navs[$result['range_id']] = $nav;
+ }
+ return $navs;
+ }
+
/**
* {@inheritdoc}
*/