From 9500f0acd34f6169066f7cc975ff286d5a4739c0 Mon Sep 17 00:00:00 2001 From: Elmar Ludwig Date: Mon, 2 Mar 2026 17:41:50 +0100 Subject: avoid batch loading of plugins by type, fixes #6260 Closes #6260 Merge request studip/studip!4740 --- lib/plugins/engine/PluginEngine.php | 53 ++++++++++++++++++++++-------------- lib/plugins/engine/PluginManager.php | 18 ------------ 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/lib/plugins/engine/PluginEngine.php b/lib/plugins/engine/PluginEngine.php index 5c7bad5..f6cb832 100644 --- a/lib/plugins/engine/PluginEngine.php +++ b/lib/plugins/engine/PluginEngine.php @@ -34,33 +34,46 @@ class PluginEngine */ public static function loadPlugins() { - global $user, $perm; - - // load system plugins - self::getPlugins(SystemPlugin::class); - - // load homepage plugins - self::getPlugins(HomepagePlugin::class); - + $plugin_manager = PluginManager::getInstance(); + $plugin_info = $plugin_manager->getPluginInfos(); $context_id = Context::getId(); - // load course plugins - if ($context_id) { - $modules = self::getPlugins(StudipModule::class, $context_id); - $navigation = Navigation::getItem('/course'); + uasort($plugin_info, fn($a, $b) => + $b['core'] - $a['core'] ?: $a['position'] - $b['position'] + ); - foreach ($modules as $module) { - $tabs = $module->getTabNavigation($context_id); + foreach ($plugin_info as $id => $info) { + // load system plugins + if (in_array(SystemPlugin::class, $info['type'])) { + $plugin_manager->getPluginById($id); + } - if ($navigation && $tabs) { - $navigation->addToolNavigation($module->getPluginId(), $tabs); + // load homepage plugins + if (in_array(HomepagePlugin::class, $info['type'])) { + $plugin_manager->getPluginById($id); + } + + // load course plugins + if (in_array(StudipModule::class, $info['type'])) { + if ($context_id) { + if ($plugin_manager->isPluginActivated($id, $context_id)) { + $navigation = Navigation::getItem('/course'); + $module = $plugin_manager->getPluginById($id); + $tabs = $module->getTabNavigation($context_id); + + if ($navigation && $tabs) { + $navigation->addToolNavigation($id, $tabs); + } + } } } - } - // load admin plugins - if (is_object($user) && $perm->have_perm('admin')) { - self::getPlugins(AdministrationPlugin::class); + // load admin plugins + if (in_array(AdministrationPlugin::class, $info['type'])) { + if ($GLOBALS['perm']->have_perm('admin')) { + $plugin_manager->getPluginById($id); + } + } } } diff --git a/lib/plugins/engine/PluginManager.php b/lib/plugins/engine/PluginManager.php index 4bcb96b..c66949a 100644 --- a/lib/plugins/engine/PluginManager.php +++ b/lib/plugins/engine/PluginManager.php @@ -51,22 +51,6 @@ class PluginManager } /** - * Comparison function used to order plugins by position. - */ - private static function positionCompare (array $plugin1, array $plugin2): int - { - if ($plugin1['core'] && !$plugin2['core']) { - return -1; - } - - if (!$plugin1['core'] && $plugin2['core']) { - return 1; - } - - return $plugin1['position'] - $plugin2['position']; - } - - /** * Read meta data for all plugins registered in the data base. */ private function readPluginInfos () @@ -662,8 +646,6 @@ class PluginManager $plugin_info = $this->getPluginInfos($type); $plugins = []; - usort($plugin_info, [self::class, 'positionCompare']); - foreach ($plugin_info as $info) { $activated = $context == null || $this->isPluginActivated($info['id'], $context); -- cgit v1.0