aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElmar Ludwig <elmar.ludwig@uni-osnabrueck.de>2024-08-05 13:12:52 +0000
committerElmar Ludwig <elmar.ludwig@uni-osnabrueck.de>2024-08-05 13:12:52 +0000
commit65e8a124a54c830b6c1938bfcd198e542aae28e9 (patch)
treedfd307d47cbfa17f5769280d13f8be8b1caebbda
parentee67801af479ed8d9a01e1db75d9f2e87b405991 (diff)
don't create plugin instances from navigation context, fixes #4317
Closes #4317 Merge request studip/studip!3218
-rw-r--r--lib/navigation/CourseNavigation.php73
-rw-r--r--lib/plugins/engine/PluginEngine.php12
2 files changed, 41 insertions, 44 deletions
diff --git a/lib/navigation/CourseNavigation.php b/lib/navigation/CourseNavigation.php
index 7db8019..13b8304 100644
--- a/lib/navigation/CourseNavigation.php
+++ b/lib/navigation/CourseNavigation.php
@@ -47,60 +47,49 @@ class CourseNavigation extends Navigation
}
/**
- * Initialize the subnavigation of this item. This method
- * is called once before the first item is added or removed.
+ * Add an array of navigation items to the subnavigation of this
+ * object. The new items are inserted at the appropriate position
+ * for this tool according to the order defined in tools_activated.
+ *
+ * @param int $plugin_id id of the module
+ * @param array $navigations navigation items to add
*/
- public function initSubNavigation()
+ public function addToolNavigation($plugin_id, array $navigations)
{
- parent::initSubNavigation();
+ $found = null;
+ $where = null;
- $admin_plugin_ids = [];
-
- $core_admin = PluginManager::getInstance()->getPlugin(CoreAdmin::class);
- if ($core_admin) {
- $admin_plugin_ids[] = $core_admin->getPluginId();
- }
-
- $core_studygroup_admin = PluginManager::getInstance()->getPlugin(CoreStudygroupAdmin::class);
- if ($core_studygroup_admin) {
- $admin_plugin_ids[] = $core_studygroup_admin->getPluginId();
- }
-
- $tools = $this->range->tools->getArrayCopy();
- usort($tools, function ($a, $b) use ($admin_plugin_ids) {
- if (in_array($a['plugin_id'], $admin_plugin_ids)) {
- return -1;
- }
- if (in_array($b['plugin_id'], $admin_plugin_ids)) {
- return 1;
- }
- return $a['position'] - $b['position'];
- });
-
- foreach ($tools as $tool) {
+ foreach ($this->range->tools as $tool) {
if (
- !($this->range instanceof Institute)
- && !Seminar_Perm::get()->have_studip_perm($tool->getVisibilityPermission(), $this->range->id)
+ $found
+ && $tool->metadata['navigation']
+ && $tool->metadata['navigation'] !== 'admin'
) {
- continue;
+ $where = $tool->metadata['navigation'];
+ break;
}
- $studip_module = $tool->getStudipModule();
- if (!($studip_module instanceof StudipModule)) {
- continue;
+ if ($tool->plugin_id == $plugin_id) {
+ $tool->metadata['navigation'] = key($navigations);
+ $found = $tool;
}
+ }
- $tool_nav = $studip_module->getTabNavigation($this->range->id) ?: [];
+ // always insert admin module in first position
+ if (key($navigations) === 'admin') {
+ $where = key($this->subnav);
+ }
- foreach ($tool_nav as $nav_name => $navigation) {
- if (!$nav_name || !$navigation instanceof Navigation) {
- continue;
+ foreach ($navigations as $key => $nav) {
+ if (
+ $this->range instanceof Institute
+ || Seminar_Perm::get()->have_studip_perm($found->getVisibilityPermission(), $this->range->id)
+ ) {
+ if (isset($found->metadata['displayname'])) {
+ $nav->setTitle($found->getDisplayname());
}
- if ($tool->metadata['displayname']) {
- $navigation->setTitle($tool->getDisplayname());
- }
- $this->addSubNavigation($nav_name, $navigation);
+ $this->insertSubNavigation($key, $nav, $where);
}
}
}
diff --git a/lib/plugins/engine/PluginEngine.php b/lib/plugins/engine/PluginEngine.php
index 25974c5..52f94af 100644
--- a/lib/plugins/engine/PluginEngine.php
+++ b/lib/plugins/engine/PluginEngine.php
@@ -44,8 +44,16 @@ class PluginEngine
// load course plugins
if (Context::getId()) {
- self::getPlugins(StudipModule::class);
- self::getPlugins(StandardPlugin::class);
+ $modules = self::getPlugins(StudipModule::class, Context::getId());
+ $navigation = Navigation::getItem('/course');
+
+ foreach ($modules as $module) {
+ $tabs = $module->getTabNavigation(Context::getId());
+
+ if ($navigation && $tabs) {
+ $navigation->addToolNavigation($module->getPluginId(), $tabs);
+ }
+ }
}
// load admin plugins