MDL-41663 Output: Allow subtype as a namespace level on it's own

This commit is contained in:
Damyon Wiese 2014-06-25 11:50:25 +08:00
parent 79046c2726
commit 1a1d3665dc
3 changed files with 58 additions and 6 deletions

View file

@ -168,6 +168,7 @@ abstract class renderer_factory_base implements renderer_factory {
* @param string $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @param string $subtype optional subtype such as 'news' resulting to:
* '\mod_forum\output\news_renderer'
* or '\mod_forum\output\news\renderer'
* or non-autoloaded 'mod_forum_news'
* @return array[] Each element of the array is an array with keys:
* classname - The class name to search
@ -242,6 +243,13 @@ abstract class renderer_factory_base implements renderer_factory {
'autoloaded' => true,
'classname' => '\\output\\' . $component . '\\' . $subtype . '_renderer'
);
// Version of the above with subtype being a namespace level on it's own.
$classnames[] = array(
'validwithprefix' => true,
'validwithoutprefix' => false,
'autoloaded' => true,
'classname' => '\\output\\' . $component . '\\' . $subtype . '\\renderer'
);
// Standard autoloaded plugin name (not valid with a prefix).
$classnames[] = array(
'validwithprefix' => false,
@ -249,6 +257,13 @@ abstract class renderer_factory_base implements renderer_factory {
'autoloaded' => true,
'classname' => '\\' . $component . '\\output\\' . $subtype . '_renderer'
);
// Version of the above with subtype being a namespace level on it's own.
$classnames[] = array(
'validwithprefix' => false,
'validwithoutprefix' => true,
'autoloaded' => true,
'classname' => '\\' . $component . '\\output\\' . $subtype . '\\renderer'
);
// Legacy class name - (valid with or without a prefix).
$classnames[] = array(
'validwithprefix' => true,
@ -288,23 +303,38 @@ class standard_renderer_factory extends renderer_factory_base {
$classname = '';
list($target, $suffix) = $this->get_target_suffix($target);
// First look for a version with a suffix.
foreach ($classnames as $classnamedetails) {
if ($classnamedetails['validwithoutprefix']) {
$newclassname = $classnamedetails['classname'] . $suffix;
if (class_exists($newclassname)) {
$classname = $newclassname;
break;
} else {
$newclassname = $classnamedetails['classname'];
if (class_exists($newclassname)) {
$classname = $newclassname;
break;
}
}
}
}
// Now look for a non-suffixed version.
if (empty($classname)) {
foreach ($classnames as $classnamedetails) {
if ($classnamedetails['validwithoutprefix']) {
$newclassname = $classnamedetails['classname'];
if (class_exists($newclassname)) {
$classname = $newclassname;
break;
}
}
}
}
if (!class_exists($classname)) {
if (empty($classname)) {
// Standard renderer must always exist.
throw new coding_exception('Request for an unknown renderer class ' . $classname);
throw new coding_exception('Request for an unknown renderer class. Searched for: ' . var_export($classnames, true));
}
return new $classname($page, $target);

View file

@ -66,10 +66,16 @@ class test_output_factory extends renderer_factory_base {
$searchtargets = array();
list($target, $suffix) = $this->get_target_suffix($target);
// Add all suffix versions first - to match the real search order.
foreach ($classnames as $classnamedetails) {
if ($classnamedetails['validwithoutprefix']) {
$newclassname = $classnamedetails['classname'] . $suffix;
$searchtargets[] = $newclassname;
}
}
// Add all non-suffixed versions now.
foreach ($classnames as $classnamedetails) {
if ($classnamedetails['validwithoutprefix']) {
$newclassname = $classnamedetails['classname'];
$searchtargets[] = $newclassname;
}

View file

@ -48,29 +48,33 @@ class core_outputfactories_testcase extends advanced_testcase {
$paths = $testfactory->get_standard_renderer_factory_search_paths('');
$this->assertSame($paths, array (
'\\core\\output\\renderer_cli',
'\\core\\output\\renderer',
'core_renderer_cli',
'\\core\\output\\renderer',
'core_renderer',
));
$paths = $testfactory->get_standard_renderer_factory_search_paths($component);
$this->assertSame($paths, array (
'\\mod_assign\\output\\renderer_cli',
'\\mod_assign\\output\\renderer',
'mod_assign_renderer_cli',
'\\mod_assign\\output\\renderer',
'mod_assign_renderer',
));
$paths = $testfactory->get_standard_renderer_factory_search_paths($component, $subtype);
$this->assertSame($paths, array (
'\\mod_assign\\output\\custom_renderer_cli',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer_cli',
'mod_assign_custom_renderer_cli',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer',
));
$paths = $testfactory->get_standard_renderer_factory_search_paths($component, $subtype, $target);
$this->assertSame($paths, array (
'\\mod_assign\\output\\custom_renderer_ajax',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer_ajax',
'mod_assign_custom_renderer_ajax',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer',
));
$paths = $testfactory->get_theme_overridden_renderer_factory_search_paths('');
@ -106,31 +110,43 @@ class core_outputfactories_testcase extends advanced_testcase {
$paths = $testfactory->get_theme_overridden_renderer_factory_search_paths($component, $subtype);
$this->assertSame($paths, array (
'theme_child\\output\\mod_assign\\custom_renderer_cli',
'theme_child\\output\\mod_assign\\custom\\renderer_cli',
'theme_child_mod_assign_custom_renderer_cli',
'theme_parent\\output\\mod_assign\\custom_renderer_cli',
'theme_parent\\output\\mod_assign\\custom\\renderer_cli',
'theme_parent_mod_assign_custom_renderer_cli',
'\\mod_assign\\output\\custom_renderer_cli',
'\\mod_assign\\output\\custom\\renderer_cli',
'mod_assign_custom_renderer_cli',
'theme_child\\output\\mod_assign\\custom_renderer',
'theme_child\\output\\mod_assign\\custom\\renderer',
'theme_child_mod_assign_custom_renderer',
'theme_parent\\output\\mod_assign\\custom_renderer',
'theme_parent\\output\\mod_assign\\custom\\renderer',
'theme_parent_mod_assign_custom_renderer',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer',
));
$paths = $testfactory->get_theme_overridden_renderer_factory_search_paths($component, $subtype, $target);
$this->assertSame($paths, array (
'theme_child\\output\\mod_assign\\custom_renderer_ajax',
'theme_child\\output\\mod_assign\\custom\\renderer_ajax',
'theme_child_mod_assign_custom_renderer_ajax',
'theme_parent\\output\\mod_assign\\custom_renderer_ajax',
'theme_parent\\output\\mod_assign\\custom\\renderer_ajax',
'theme_parent_mod_assign_custom_renderer_ajax',
'\\mod_assign\\output\\custom_renderer_ajax',
'\\mod_assign\\output\\custom\\renderer_ajax',
'mod_assign_custom_renderer_ajax',
'theme_child\\output\\mod_assign\\custom_renderer',
'theme_child\\output\\mod_assign\\custom\\renderer',
'theme_child_mod_assign_custom_renderer',
'theme_parent\\output\\mod_assign\\custom_renderer',
'theme_parent\\output\\mod_assign\\custom\\renderer',
'theme_parent_mod_assign_custom_renderer',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer',
));
}