diff --git a/lib/classes/component.php b/lib/classes/component.php index 754e44a86c1..5ea3dfd4996 100644 --- a/lib/classes/component.php +++ b/lib/classes/component.php @@ -910,18 +910,24 @@ $cache = '.var_export($cache, true).'; * e.g. get_component_classes_in_namespace('mod_forum', 'event') * * @param string $component A valid moodle component (frankenstyle) - * @param string $namespace Namespace from the component name. + * @param string $namespace Namespace from the component name or empty if all $component namespace classes. * @return array The full class name as key and the class path as value. */ public static function get_component_classes_in_namespace($component, $namespace = '') { - // We will add them later. - $namespace = ltrim($namespace, '\\'); + $component = self::normalize_componentname($component); - // We need add double backslashes as it is how classes are stored into self::$classmap. - $namespace = implode('\\\\', explode('\\', $namespace)); + if ($namespace) { - $regex = '/^' . $component . '\\\\' . $namespace . '/'; + // We will add them later. + $namespace = trim($namespace, '\\'); + + // We need add double backslashes as it is how classes are stored into self::$classmap. + $namespace = implode('\\\\', explode('\\', $namespace)); + $namespace = $namespace . '\\\\'; + } + + $regex = '|^' . $component . '\\\\' . $namespace . '|'; $it = new RegexIterator(new ArrayIterator(self::$classmap), $regex, RegexIterator::GET_MATCH, RegexIterator::USE_KEY); // We want to be sure that they exist. diff --git a/lib/tests/component_test.php b/lib/tests/component_test.php index b3294117219..0fac4c2ceba 100644 --- a/lib/tests/component_test.php +++ b/lib/tests/component_test.php @@ -458,15 +458,33 @@ class core_component_testcase extends advanced_testcase { $this->assertCount(0, core_component::get_component_classes_in_namespace('core_unexistingcomponent', 'something')); $this->assertCount(0, core_component::get_component_classes_in_namespace('auth_cas', 'something')); + // Matches the last namespace level name not partials. + $this->assertCount(0, core_component::get_component_classes_in_namespace('auth_cas', 'tas')); + $this->assertCount(0, core_component::get_component_classes_in_namespace('core_user', 'course')); + $this->assertCount(0, core_component::get_component_classes_in_namespace('mod_forum', 'output\\emaildigest')); + $this->assertCount(0, core_component::get_component_classes_in_namespace('mod_forum', '\\output\\emaildigest')); + $this->assertCount(2, core_component::get_component_classes_in_namespace('mod_forum', 'output\\email')); + $this->assertCount(2, core_component::get_component_classes_in_namespace('mod_forum', '\\output\\email')); + $this->assertCount(2, core_component::get_component_classes_in_namespace('mod_forum', 'output\\email\\')); + $this->assertCount(2, core_component::get_component_classes_in_namespace('mod_forum', '\\output\\email\\')); + // Prefix with backslash if it doesn\'t come prefixed. $this->assertCount(1, core_component::get_component_classes_in_namespace('auth_cas', 'task')); $this->assertCount(1, core_component::get_component_classes_in_namespace('auth_cas', '\\task')); - // Core as a component works. + // Core as a component works, the funcion can normalise the component name. $this->assertCount(7, core_component::get_component_classes_in_namespace('core', 'update')); + $this->assertCount(7, core_component::get_component_classes_in_namespace('', 'update')); + $this->assertCount(7, core_component::get_component_classes_in_namespace('moodle', 'update')); // Multiple levels. $this->assertCount(5, core_component::get_component_classes_in_namespace('core_user', '\\output\\myprofile\\')); + $this->assertCount(5, core_component::get_component_classes_in_namespace('core_user', 'output\\myprofile\\')); $this->assertCount(5, core_component::get_component_classes_in_namespace('core_user', '\\output\\myprofile')); + $this->assertCount(5, core_component::get_component_classes_in_namespace('core_user', 'output\\myprofile')); + + // Without namespace it returns classes/ classes. + $this->assertCount(2, core_component::get_component_classes_in_namespace('tool_mobile', '')); + $this->assertCount(1, core_component::get_component_classes_in_namespace('tool_filetypes')); } } diff --git a/mod/forum/classes/output/email/renderer.php b/mod/forum/classes/output/email/renderer.php index 10a19e42f15..17657fde33f 100644 --- a/mod/forum/classes/output/email/renderer.php +++ b/mod/forum/classes/output/email/renderer.php @@ -26,6 +26,8 @@ namespace mod_forum\output\email; defined('MOODLE_INTERNAL') || die(); +require_once(__DIR__ . '/../../../renderer.php'); + /** * Forum post renderable. *