aboutsummaryrefslogtreecommitdiff
path: root/lib/modules/CoursewareModule.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/CoursewareModule.php
parentca3ade956dd9c9041c07cef048136fa91f5faca2 (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.php78
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;
}
/**