*
* @param string $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @param moodle_page $page the page the renderer is outputting content for.
+ * @param string $subtype optional subtype such as 'news' resulting to 'mod_forum_news'
* @return object an object implementing the requested renderer interface.
*/
- public function get_renderer($component, $page);
+ public function get_renderer($component, $page, $subtype=null);
}
* @param string $module the name of part of moodle. E.g. 'core', 'quiz', 'qtype_multichoice'.
* @param moodle_page $page the page we are rendering
* @return moodle_renderer_base the requested renderer.
+ * @param string $subtype optional subtype such as 'news' resulting to 'mod_forum_news'
*/
- public function get_renderer($module, $page) {
+ public function get_renderer($module, $page, $subtype=null) {
if (is_null($this->rf)) {
if (CLI_SCRIPT) {
$classname = 'cli_renderer_factory';
$this->rf = new $classname($this);
}
- return $this->rf->get_renderer($module, $page);
+ return $this->rf->get_renderer($module, $page, $subtype);
}
/**
* the class definition of the default renderer has been loaded.
*
* @param string $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
+ * @param string $subtype optional subtype such as 'news' resulting to 'mod_forum_news'
* @return string the name of the standard renderer class for that module.
*/
- protected function standard_renderer_class_for_module($component) {
+ protected function standard_renderer_class_for_module($component, $subtype=null) {
if ($component != 'core') {
$pluginrenderer = get_component_directory($component) . '/renderer.php';
if (file_exists($pluginrenderer)) {
include_once($pluginrenderer);
}
}
- $class = 'moodle_' . $component . '_renderer';
+ if (is_null($subtype)) {
+ $class = 'moodle_' . $component . '_renderer';
+ } else {
+ $class = 'moodle_' . $component . '_' . $subtype . '_renderer';
+ }
if (!class_exists($class)) {
throw new coding_exception('Request for an unknown renderer class ' . $class);
}
*/
class standard_renderer_factory extends renderer_factory_base {
/* Implement the subclass method. */
- public function get_renderer($module, $page) {
+ public function get_renderer($module, $page, $subtype=null) {
if ($module == 'core') {
return new moodle_core_renderer($page);
} else {
- $class = $this->standard_renderer_class_for_module($module);
+ $class = $this->standard_renderer_class_for_module($module, $subtype);
return new $class($page, $this->get_renderer('core', $page));
}
}
*/
class cli_renderer_factory extends standard_renderer_factory {
/* Implement the subclass method. */
- public function get_renderer($module, $page) {
+ public function get_renderer($module, $page, $subtype=null) {
if ($module == 'core') {
return new cli_core_renderer($page);
} else {
- parent::get_renderer($module, $page);
+ parent::get_renderer($module, $page, $subtype);
}
}
}
}
/* Implement the subclass method. */
- public function get_renderer($module, $page) {
+ public function get_renderer($module, $page, $subtype=null) {
foreach ($this->prefixes as $prefix) {
- $classname = $prefix . $module . '_renderer';
+ if (is_null($subtype)) {
+ $classname = $prefix . $module . '_renderer';
+ } else {
+ $classname = $prefix . $module . '_' . $subtype . '_renderer';
+ }
if (class_exists($classname)) {
if ($module == 'core') {
return new $classname($page);
}
}
}
- return parent::get_renderer($module, $page);
+ return parent::get_renderer($module, $page, $subtype);
}
}
}
/* Implement the subclass method. */
- public function get_renderer($module, $page) {
+ public function get_renderer($module, $page, $subtype=null) {
// Refine the list of search paths for this module.
$searchpaths = array();
foreach ($this->searchpaths as $rootpath) {
$path = $rootpath . '/' . $module;
+ if (!is_null($subtype)) {
+ $path .= '/' . $subtype;
+ }
if (is_dir($path)) {
$searchpaths[] = $path;
}
}
// Create a template_renderer that copies the API of the standard renderer.
- $copiedclass = $this->standard_renderer_class_for_module($module);
+ $copiedclass = $this->standard_renderer_class_for_module($module, $subtype);
return new template_renderer($copiedclass, $searchpaths, $page);
}
}
parent::__construct(null);
}
- public function get_renderer($module, $page) {
- $this->createcalls[] = $module;
+ public function get_renderer($module, $page, $subtype=null) {
+ if (!in_array(array($module, $subtype), $this->createcalls)) {
+ $this->createcalls[] = array($module, $subtype);
+ }
return new moodle_core_renderer($page);
}
- public function standard_renderer_class_for_module($module) {
- return parent::standard_renderer_class_for_module($module);
+ public function standard_renderer_class_for_module($module, $subtype=null) {
+ return parent::standard_renderer_class_for_module($module, $subtype);
}
}
}
+/**
+ * Renderer class for testing subrendering feature
+ *
+ * @copyright 2009 David Mudrak
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class moodle_mod_test_subtype_renderer extends moodle_core_renderer {
+ public function __construct($containerstack, $page) {
+ parent::__construct($containerstack, $page, null);
+ }
+
+ public function signature($user = 'Administrator') {
+ return '<div class="signature">Best regards, ' . $user . '</div>';
+ }
+}
+
+
/**
* Unit tests for the requriement_base base class.
*
// Set up.
$factory = new testable_renderer_factory();
// Exercise SUT.
- $renderer = $factory->get_renderer('modulename', new moodle_page);
+ $renderer = $factory->get_renderer('modulename', new moodle_page);
+ $subrenderer = $factory->get_renderer('modulename', new moodle_page, 'subtype');
+ $cached = $factory->get_renderer('modulename', new moodle_page);
// Verify outcome
- $this->assertEqual(array('modulename'), $factory->createcalls);
+ $this->assertEqual(array(array('modulename', null), array('modulename', 'subtype')), $factory->createcalls);
+
}
public function test_standard_renderer_class_for_module_core() {
$this->assertEqual('moodle_mod_test_renderer', $classname);
}
+ public function test_standard_renderer_class_for_module_test_with_subtype() {
+ // Set up.
+ $factory = new testable_renderer_factory();
+ // Exercise SUT.
+ $classname = $factory->standard_renderer_class_for_module('mod_test', 'subtype');
+ // Verify outcome
+ $this->assertEqual('moodle_mod_test_subtype_renderer', $classname);
+ }
+
public function test_standard_renderer_class_for_module_unknown() {
// Set up.
$factory = new testable_renderer_factory();
$renderer = $this->factory->get_renderer('mod_test', new moodle_page);
$this->assertIsA($renderer, 'moodle_mod_test_renderer');
}
+
+ public function test_get_test_subtype_renderer() {
+ $renderer = $this->factory->get_renderer('mod_test', new moodle_page, 'subtype');
+ $this->assertIsA($renderer, 'moodle_mod_test_subtype_renderer');
+ }
}
$renderer = $this->factory->get_renderer('mod_test', new moodle_page);
$this->assertIsA($renderer, 'moodle_mod_test_renderer');
}
+
+ public function test_get_test_subtype_renderer() {
+ $renderer = $this->factory->get_renderer('mod_test', new moodle_page, 'subtype');
+ $this->assertIsA($renderer, 'moodle_mod_test_subtype_renderer');
+ }
}
$factory = new testable_theme_overridden_renderer_factory($theme, $this->page);
// Exercise SUT.
- $renderer = $factory->get_renderer('mod_test', new moodle_page);
+ $renderer = $factory->get_renderer('mod_test', new moodle_page);
+ $subrenderer = $factory->get_renderer('mod_test', new moodle_page, 'subtype');
// Verify outcome
$this->assertIsA($renderer, 'moodle_mod_test_renderer');
+ $this->assertIsA($subrenderer, 'moodle_mod_test_subtype_renderer');
}
public function test_get_renderer_overridden() {
$factory = new testable_theme_overridden_renderer_factory($theme, $this->page);
// Exercise SUT.
- $renderer = $factory->get_renderer('mod_test', new moodle_page);
+ $renderer = $factory->get_renderer('mod_test', new moodle_page);
+ $subrenderer = $factory->get_renderer('mod_test', new moodle_page, 'subtype');
// Verify outcome
$this->assertIsA($renderer, 'testrenderertheme_mod_test_renderer');
+ $this->assertIsA($subrenderer, 'moodle_mod_test_subtype_renderer');
}
public function test_get_renderer_overridden_in_parent() {
return $theme;
}
- protected function make_theme_template_dir($name, $module = '') {
+ protected function make_theme_template_dir($name, $module = '', $submodule = '') {
$path = $this->workspace . '/' . $name . '/templates';
if ($module) {
$path .= '/' . $module;
}
+ if ($submodule) {
+ $path .= '/' . $submodule;
+ }
make_upload_directory($path);
}
$this->make_theme_template_dir('standardtemplate');
// Exercise SUT.
- $factory = new testable_template_renderer_factory($theme, $this->page);
+ $factory = new testable_template_renderer_factory($theme, $this->page);
+ $subfactory = new testable_template_renderer_factory($theme, $this->page, 'subtype');
// Verify outcome
$this->assertEqual(array(
$CFG->themedir . '/mytheme/templates',
$CFG->themedir . '/standardtemplate/templates'),
$factory->get_search_paths());
+ $this->assertEqual(array(
+ $CFG->themedir . '/mytheme/templates',
+ $CFG->themedir . '/standardtemplate/templates'),
+ $subfactory->get_search_paths());
}
public function test_get_renderer() {
$this->make_theme_template_dir('mytheme', 'core');
$this->make_theme_template_dir('parenttheme', 'mod_test');
$this->make_theme_template_dir('standardtemplate', 'mod_test');
+ $this->make_theme_template_dir('parenttheme', 'mod_test', 'subtype');
+ $this->make_theme_template_dir('standardtemplate', 'mod_test', 'subtype');
$factory = new testable_template_renderer_factory($theme);
// Exercise SUT.
- $renderer = $factory->get_renderer('mod_test', $this->page);
+ $renderer = $factory->get_renderer('mod_test', $this->page);
+ $subrenderer = $factory->get_renderer('mod_test', $this->page, 'subtype');
// Verify outcome
$this->assertEqual('moodle_mod_test_renderer', $renderer->get_copied_class());
$CFG->themedir . '/parenttheme/templates/mod_test',
$CFG->themedir . '/standardtemplate/templates/mod_test'),
$renderer->get_search_paths());
+ $this->assertEqual('moodle_mod_test_subtype_renderer', $subrenderer->get_copied_class());
+ $this->assertEqual(array(
+ $CFG->themedir . '/parenttheme/templates/mod_test/subtype',
+ $CFG->themedir . '/standardtemplate/templates/mod_test/subtype'),
+ $subrenderer->get_search_paths());
}
}