mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 16:36:37 +02:00
MDL-41663 Output: Allow subtype as a namespace level on it's own
This commit is contained in:
parent
79046c2726
commit
1a1d3665dc
3 changed files with 58 additions and 6 deletions
|
@ -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);
|
||||
|
|
6
lib/tests/fixtures/test_renderer_factory.php
vendored
6
lib/tests/fixtures/test_renderer_factory.php
vendored
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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',
|
||||
));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue