diff options
| author | Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de> | 2024-08-05 13:12:52 +0000 |
|---|---|---|
| committer | Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de> | 2024-08-05 13:12:52 +0000 |
| commit | 65e8a124a54c830b6c1938bfcd198e542aae28e9 (patch) | |
| tree | dfd307d47cbfa17f5769280d13f8be8b1caebbda | |
| parent | ee67801af479ed8d9a01e1db75d9f2e87b405991 (diff) | |
don't create plugin instances from navigation context, fixes #4317
Closes #4317
Merge request studip/studip!3218
| -rw-r--r-- | lib/navigation/CourseNavigation.php | 73 | ||||
| -rw-r--r-- | lib/plugins/engine/PluginEngine.php | 12 |
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 |
