aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElmar Ludwig <elmar.ludwig@uni-osnabrueck.de>2026-03-02 17:41:50 +0100
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2026-03-03 09:07:31 +0100
commitda22e56bcfa6cba754f603358180e2bfa9eadfe8 (patch)
tree05d229e4ff63917bc679f2cb3c2d688468dee000
parent7c5e5c9a6344e347b778d055da57f176788a66f5 (diff)
avoid batch loading of plugins by type, fixes #6260
Closes #6260 Merge request studip/studip!4740
-rw-r--r--lib/plugins/engine/PluginEngine.php55
-rw-r--r--lib/plugins/engine/PluginManager.php18
2 files changed, 35 insertions, 38 deletions
diff --git a/lib/plugins/engine/PluginEngine.php b/lib/plugins/engine/PluginEngine.php
index 52f94af..03c00cf 100644
--- a/lib/plugins/engine/PluginEngine.php
+++ b/lib/plugins/engine/PluginEngine.php
@@ -34,31 +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);
-
- // load course plugins
- if (Context::getId()) {
- $modules = self::getPlugins(StudipModule::class, Context::getId());
- $navigation = Navigation::getItem('/course');
+ $plugin_manager = PluginManager::getInstance();
+ $plugin_info = $plugin_manager->getPluginInfos();
+ $context_id = Context::getId();
+
+ uasort($plugin_info, fn($a, $b) =>
+ $b['core'] - $a['core'] ?: $a['position'] - $b['position']
+ );
+
+ foreach ($plugin_info as $id => $info) {
+ // load system plugins
+ if (in_array(SystemPlugin::class, $info['type'])) {
+ $plugin_manager->getPluginById($id);
+ }
- foreach ($modules as $module) {
- $tabs = $module->getTabNavigation(Context::getId());
+ // load homepage plugins
+ if (in_array(HomepagePlugin::class, $info['type'])) {
+ $plugin_manager->getPluginById($id);
+ }
- if ($navigation && $tabs) {
- $navigation->addToolNavigation($module->getPluginId(), $tabs);
+ // 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);