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 $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @param string $subtype optional subtype such as 'news' resulting to: * @param string $subtype optional subtype such as 'news' resulting to:
* '\mod_forum\output\news_renderer' * '\mod_forum\output\news_renderer'
* or '\mod_forum\output\news\renderer'
* or non-autoloaded 'mod_forum_news' * or non-autoloaded 'mod_forum_news'
* @return array[] Each element of the array is an array with keys: * @return array[] Each element of the array is an array with keys:
* classname - The class name to search * classname - The class name to search
@ -242,6 +243,13 @@ abstract class renderer_factory_base implements renderer_factory {
'autoloaded' => true, 'autoloaded' => true,
'classname' => '\\output\\' . $component . '\\' . $subtype . '_renderer' '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). // Standard autoloaded plugin name (not valid with a prefix).
$classnames[] = array( $classnames[] = array(
'validwithprefix' => false, 'validwithprefix' => false,
@ -249,6 +257,13 @@ abstract class renderer_factory_base implements renderer_factory {
'autoloaded' => true, 'autoloaded' => true,
'classname' => '\\' . $component . '\\output\\' . $subtype . '_renderer' '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). // Legacy class name - (valid with or without a prefix).
$classnames[] = array( $classnames[] = array(
'validwithprefix' => true, 'validwithprefix' => true,
@ -288,23 +303,38 @@ class standard_renderer_factory extends renderer_factory_base {
$classname = ''; $classname = '';
list($target, $suffix) = $this->get_target_suffix($target); list($target, $suffix) = $this->get_target_suffix($target);
// First look for a version with a suffix.
foreach ($classnames as $classnamedetails) { foreach ($classnames as $classnamedetails) {
if ($classnamedetails['validwithoutprefix']) { if ($classnamedetails['validwithoutprefix']) {
$newclassname = $classnamedetails['classname'] . $suffix; $newclassname = $classnamedetails['classname'] . $suffix;
if (class_exists($newclassname)) { if (class_exists($newclassname)) {
$classname = $newclassname; $classname = $newclassname;
break;
} else { } else {
$newclassname = $classnamedetails['classname']; $newclassname = $classnamedetails['classname'];
if (class_exists($newclassname)) { if (class_exists($newclassname)) {
$classname = $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. // 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); return new $classname($page, $target);

View file

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

View file

@ -48,29 +48,33 @@ class core_outputfactories_testcase extends advanced_testcase {
$paths = $testfactory->get_standard_renderer_factory_search_paths(''); $paths = $testfactory->get_standard_renderer_factory_search_paths('');
$this->assertSame($paths, array ( $this->assertSame($paths, array (
'\\core\\output\\renderer_cli', '\\core\\output\\renderer_cli',
'\\core\\output\\renderer',
'core_renderer_cli', 'core_renderer_cli',
'\\core\\output\\renderer',
'core_renderer', 'core_renderer',
)); ));
$paths = $testfactory->get_standard_renderer_factory_search_paths($component); $paths = $testfactory->get_standard_renderer_factory_search_paths($component);
$this->assertSame($paths, array ( $this->assertSame($paths, array (
'\\mod_assign\\output\\renderer_cli', '\\mod_assign\\output\\renderer_cli',
'\\mod_assign\\output\\renderer',
'mod_assign_renderer_cli', 'mod_assign_renderer_cli',
'\\mod_assign\\output\\renderer',
'mod_assign_renderer', 'mod_assign_renderer',
)); ));
$paths = $testfactory->get_standard_renderer_factory_search_paths($component, $subtype); $paths = $testfactory->get_standard_renderer_factory_search_paths($component, $subtype);
$this->assertSame($paths, array ( $this->assertSame($paths, array (
'\\mod_assign\\output\\custom_renderer_cli', '\\mod_assign\\output\\custom_renderer_cli',
'\\mod_assign\\output\\custom_renderer', '\\mod_assign\\output\\custom\\renderer_cli',
'mod_assign_custom_renderer_cli', 'mod_assign_custom_renderer_cli',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer', 'mod_assign_custom_renderer',
)); ));
$paths = $testfactory->get_standard_renderer_factory_search_paths($component, $subtype, $target); $paths = $testfactory->get_standard_renderer_factory_search_paths($component, $subtype, $target);
$this->assertSame($paths, array ( $this->assertSame($paths, array (
'\\mod_assign\\output\\custom_renderer_ajax', '\\mod_assign\\output\\custom_renderer_ajax',
'\\mod_assign\\output\\custom_renderer', '\\mod_assign\\output\\custom\\renderer_ajax',
'mod_assign_custom_renderer_ajax', 'mod_assign_custom_renderer_ajax',
'\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer', 'mod_assign_custom_renderer',
)); ));
$paths = $testfactory->get_theme_overridden_renderer_factory_search_paths(''); $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); $paths = $testfactory->get_theme_overridden_renderer_factory_search_paths($component, $subtype);
$this->assertSame($paths, array ( $this->assertSame($paths, array (
'theme_child\\output\\mod_assign\\custom_renderer_cli', 'theme_child\\output\\mod_assign\\custom_renderer_cli',
'theme_child\\output\\mod_assign\\custom\\renderer_cli',
'theme_child_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\\output\\mod_assign\\custom\\renderer_cli',
'theme_parent_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\\output\\custom\\renderer_cli',
'mod_assign_custom_renderer_cli', 'mod_assign_custom_renderer_cli',
'theme_child\\output\\mod_assign\\custom_renderer', 'theme_child\\output\\mod_assign\\custom_renderer',
'theme_child\\output\\mod_assign\\custom\\renderer',
'theme_child_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\\output\\mod_assign\\custom\\renderer',
'theme_parent_mod_assign_custom_renderer', 'theme_parent_mod_assign_custom_renderer',
'\\mod_assign\\output\\custom_renderer', '\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer', 'mod_assign_custom_renderer',
)); ));
$paths = $testfactory->get_theme_overridden_renderer_factory_search_paths($component, $subtype, $target); $paths = $testfactory->get_theme_overridden_renderer_factory_search_paths($component, $subtype, $target);
$this->assertSame($paths, array ( $this->assertSame($paths, array (
'theme_child\\output\\mod_assign\\custom_renderer_ajax', 'theme_child\\output\\mod_assign\\custom_renderer_ajax',
'theme_child\\output\\mod_assign\\custom\\renderer_ajax',
'theme_child_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\\output\\mod_assign\\custom\\renderer_ajax',
'theme_parent_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\\output\\custom\\renderer_ajax',
'mod_assign_custom_renderer_ajax', 'mod_assign_custom_renderer_ajax',
'theme_child\\output\\mod_assign\\custom_renderer', 'theme_child\\output\\mod_assign\\custom_renderer',
'theme_child\\output\\mod_assign\\custom\\renderer',
'theme_child_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\\output\\mod_assign\\custom\\renderer',
'theme_parent_mod_assign_custom_renderer', 'theme_parent_mod_assign_custom_renderer',
'\\mod_assign\\output\\custom_renderer', '\\mod_assign\\output\\custom_renderer',
'\\mod_assign\\output\\custom\\renderer',
'mod_assign_custom_renderer', 'mod_assign_custom_renderer',
)); ));
} }