diff options
| author | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2025-08-07 10:13:09 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2025-08-07 10:13:09 +0200 |
| commit | b1bc66f361a4dda92aba22fdd42843f619797a6c (patch) | |
| tree | ecf6a08bddd1230edf7b49fc756073b4071ba169 /lib/modules/CoursewareModule.php | |
| parent | ca3ade956dd9c9041c07cef048136fa91f5faca2 (diff) | |
implement performance optimizations for my courses, fixes #4693
Closes #4693
Merge request studip/studip!3724
Diffstat (limited to 'lib/modules/CoursewareModule.php')
| -rw-r--r-- | lib/modules/CoursewareModule.php | 78 |
1 files changed, 42 insertions, 36 deletions
diff --git a/lib/modules/CoursewareModule.php b/lib/modules/CoursewareModule.php index c081e6a..5b12cd6 100644 --- a/lib/modules/CoursewareModule.php +++ b/lib/modules/CoursewareModule.php @@ -3,8 +3,10 @@ use Courseware\Instance; use Courseware\StructuralElement; -class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule +class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModuleExtended { + use IconNavigationTrait; + /** * {@inheritdoc} */ @@ -79,54 +81,58 @@ class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule return ['courseware' => $navigation]; } - /** - * {@inheritdoc} - */ - public function getIconNavigation($courseId, $last_visit, $user_id) + public function getManyIconNavigation(array $course_ids, ?string $user_id = null): array { if ($user_id === 'nobody') { - return null; + return []; } - $statement = DBManager::get()->prepare(" - SELECT COUNT(DISTINCT elem.id) + $results = DBManager::get()->fetchGrouped( + "SELECT elem.range_id, + COUNT(IF((blocks.chdate > IFNULL(ouv.visitdate, :threshold) AND blocks.editor_id != :user_id), elem.id, NULL)) AS neue FROM `cw_structural_elements` AS elem INNER JOIN `cw_containers` as container ON (elem.id = container.structural_element_id) INNER JOIN `cw_blocks` as blocks ON (container.id = blocks.container_id) + LEFT JOIN object_user_visits AS ouv + ON ouv.object_id = elem.range_id + AND ouv.user_id = :user_id + AND ouv.plugin_id = :plugin_id WHERE elem.range_type = 'course' - AND elem.range_id = :range_id + AND elem.range_id IN (:range_ids) AND blocks.payload != '' - AND blocks.chdate > :last_visit AND blocks.editor_id != :user_id - "); - - $statement->execute([ - 'range_id' => $courseId, - 'last_visit' => $last_visit, - 'user_id' => $user_id - ]); - - $new = $statement->fetchColumn(); + GROUP BY elem.range_id", + [ + 'user_id' => $user_id, + 'range_ids' => $course_ids, + 'threshold' => object_get_visit_threshold(), + 'plugin_id' => $this->getPluginId(), + ] + ); - $nav = new Navigation(_('Courseware'), 'dispatch.php/course/courseware'); - $nav->setImage(Icon::create('courseware')); - $nav->setLinkAttributes(['title' => _('Courseware')]); + $navs = []; + foreach ($course_ids as $course_id) { + $nav = new Navigation(_('Courseware'), 'dispatch.php/course/courseware'); + $nav->setImage(Icon::create('courseware')); + $nav->setLinkAttributes(['title' => _('Courseware'),]); + + if (!empty($results[$course_id]['neue'])) { + $text = sprintf( + ngettext( + '%u neue Seite', + '%u neue Seiten', + $results[$course_id]['neue'] + ), + $results[$course_id]['neue'] + ); + $nav->setImage(Icon::create('courseware', Icon::ROLE_ATTENTION)); + $nav->setLinkAttributes(['title' => $text]); + $nav->setBadgeNumber($results[$course_id]['neue']); + } - if ($new > 0) { - $text = sprintf( - ngettext( - '%u neue Seite', - '%u neue Seiten', - $new - ), - $new - ); - $nav->setImage(Icon::create('courseware', Icon::ROLE_ATTENTION)); - $nav->setLinkAttributes(['title' => $text]); - $nav->setBadgeNumber($new); + $navs[$course_id] = $nav; } - - return $nav; + return $navs; } /** |
