diff --git a/lib/classes/component.php b/lib/classes/component.php index a7b804e3b19..c21fce847cc 100644 --- a/lib/classes/component.php +++ b/lib/classes/component.php @@ -1244,4 +1244,38 @@ $cache = '.var_export($cache, true).'; } } } + + /** + * Returns a list of frankenstyle component names and their paths, for all components (plugins and subsystems). + * + * E.g. + * [ + * 'mod' => [ + * 'mod_forum' => FORUM_PLUGIN_PATH, + * ... + * ], + * ... + * 'core' => [ + * 'core_comment' => COMMENT_SUBSYSTEM_PATH, + * ... + * ] + * ] + * + * @return array an associative array of components and their corresponding paths. + */ + public static function get_component_list() : array { + $components = []; + // Get all plugins. + foreach (self::get_plugin_types() as $plugintype => $typedir) { + $components[$plugintype] = []; + foreach (self::get_plugin_list($plugintype) as $pluginname => $plugindir) { + $components[$plugintype][$plugintype . '_' . $pluginname] = $plugindir; + } + } + // Get all subsystems. + foreach (self::get_core_subsystems() as $subsystemname => $subsystempath) { + $components['core']['core_' . $subsystemname] = $subsystempath; + } + return $components; + } } diff --git a/lib/tests/component_test.php b/lib/tests/component_test.php index 78206a6efe0..845419e0e8b 100644 --- a/lib/tests/component_test.php +++ b/lib/tests/component_test.php @@ -779,4 +779,30 @@ class core_component_testcase extends advanced_testcase { $file = $psrclassloader->invokeArgs(null, array($classname, $prefix, $path, $separators)); $this->assertEquals($result, $file); } + + /** + * Confirm the get_component_list method contains an entry for every component. + */ + public function test_get_component_list_contains_all_components() { + global $CFG; + $componentslist = \core_component::get_component_list(); + + // We should have an entry for each plugin type, and one additional for 'core'. + $plugintypes = \core_component::get_plugin_types(); + $numelementsexpected = count($plugintypes) + 1; + $this->assertEquals($numelementsexpected, count($componentslist)); + + // And an entry for each of the plugin types. + foreach (array_keys($plugintypes) as $plugintype) { + $this->assertArrayHasKey($plugintype, $componentslist); + } + + // And finally, one for 'core'. + $this->assertArrayHasKey('core', $componentslist); + + // Check a few of the known plugin types to confirm their presence at their respective type index. + $this->assertEquals($componentslist['core']['core_comment'], $CFG->dirroot . '/comment'); + $this->assertEquals($componentslist['mod']['mod_forum'], $CFG->dirroot . '/mod/forum'); + $this->assertEquals($componentslist['tool']['tool_analytics'], $CFG->dirroot . '/admin/tool/analytics'); + } }