MDL-31989 component: Allow classes to be retrieved by namespace

This commit is contained in:
David Monllao 2016-02-17 11:48:06 +08:00 committed by Dan Poltawski
parent db48207e1a
commit f900b2b6c9
2 changed files with 53 additions and 1 deletions

View File

@ -397,7 +397,7 @@ $cache = '.var_export($cache, true).';
'repository' => $CFG->dirroot.'/repository',
'rss' => $CFG->dirroot.'/rss',
'role' => $CFG->dirroot.'/'.$CFG->admin.'/roles',
'search' => null,
'search' => $CFG->dirroot.'/search',
'table' => null,
'tag' => $CFG->dirroot.'/tag',
'timezones' => null,
@ -439,6 +439,7 @@ $cache = '.var_export($cache, true).';
'webservice' => $CFG->dirroot.'/webservice',
'repository' => $CFG->dirroot.'/repository',
'portfolio' => $CFG->dirroot.'/portfolio',
'search' => $CFG->dirroot.'/search/engine',
'qbehaviour' => $CFG->dirroot.'/question/behaviour',
'qformat' => $CFG->dirroot.'/question/format',
'plagiarism' => $CFG->dirroot.'/plagiarism',
@ -897,6 +898,39 @@ $cache = '.var_export($cache, true).';
return $pluginfiles;
}
/**
* Returns all classes in a component matching the provided namespace.
*
* It checks that the class exists.
*
* 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.
* @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, '\\');
// We need add double backslashes as it is how classes are stored into self::$classmap.
$namespace = implode('\\\\', explode('\\', $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.
$classes = array();
foreach ($it as $classname => $classpath) {
if (class_exists($classname)) {
$classes[$classname] = $classpath;
}
}
return $classes;
}
/**
* Returns the exact absolute path to plugin directory.
*

View File

@ -451,4 +451,22 @@ class core_component_testcase extends advanced_testcase {
$list = core_component::get_plugin_list_with_file('report', 'idontexist.php', true);
$this->assertEquals(array(), array_keys($list));
}
public function test_get_component_classes_int_namespace() {
// Unexisting.
$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'));
// 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.
$this->assertCount(7, core_component::get_component_classes_in_namespace('core', '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'));
}
}