MDL-21143 theme renderers related refactoring, it should detect more problems now, there is also a list of core renderer subtypes, hopefully the api changes are improvements

This commit is contained in:
Petr Skoda
2009-12-17 13:45:54 +00:00
parent b9f0ecb39e
commit 56cbc53b76
20 changed files with 107 additions and 75 deletions
+1 -1
View File
@@ -1147,7 +1147,7 @@ class block_manager {
$editpage->set_title($strheading);
$editpage->set_heading($strheading);
$output = $editpage->theme->get_renderer('core', $editpage);
$output = $editpage->find_renderer('core');
echo $output->header();
echo $output->heading($strheading, 2);
$mform->display();
+55 -46
View File
@@ -61,12 +61,12 @@ interface renderer_factory {
* $subtype parameter. For example workshop_renderer,
* workshop_allocation_manual_renderer etc.
*
* @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 $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @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, $subtype=null);
public function get_renderer(moodle_page $page, $component, $subtype=null);
}
@@ -86,6 +86,8 @@ interface renderer_factory {
abstract class renderer_factory_base implements renderer_factory {
/** @var theme_config the theme we belong to. */
protected $theme;
/** @var hardcoded list of core subtypes and their locations */
protected $core_subtypes = array('webservice'=>'webservice');
/**
* Constructor.
@@ -106,28 +108,38 @@ abstract class renderer_factory_base implements renderer_factory {
* @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_plugin($component, $subtype=null) {
protected function standard_renderer_classname($component, $subtype=null) {
global $CFG; // needed in incldued files
if ($component !== 'core') {
// renderers are stored in lib.php files like the rest of standard functions and classes
$libfile = get_component_directory($component) . '/renderer.php';
if (file_exists($libfile)) {
include_once($libfile);
// standardize component names
if (strpos($component, '_') === false) {
$component = $component.'_mod';
}
// renderers are stored in renderer.php files
if (!$compdirectory = get_component_directory($component)) {
throw new coding_exception('Invalid component specified in renderer request');
}
$rendererfile = $compdirectory . '/renderer.php';
if (file_exists($rendererfile)) {
include_once($rendererfile);
}
} else if (!empty($subtype)) {
if (!isset($this->core_subtypes[$subtype])) {
throw new coding_exception('Invalid core subtype "'.$subtype.'" in renderer request');
}
$rendererfile = $CFG->dirroot . '/' . $this->core_subtypes[$subtype] . '/renderer.php';
if (file_exists($rendererfile)) {
include_once($rendererfile);
}
}
if (strpos($component, 'mod_') === 0) {
$component = substr($component, 4);
}
if (is_null($subtype)) {
if (empty($subtype)) {
$class = $component . '_renderer';
} else {
$class = $component . '_' . $subtype . '_renderer';
}
if (!class_exists($class)) {
throw new coding_exception('Request for an unknown renderer class ' . $class);
}
return $class;
}
}
@@ -144,43 +156,45 @@ abstract class renderer_factory_base implements renderer_factory {
class standard_renderer_factory extends renderer_factory_base {
/**
* Implement the subclass method
* @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 $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @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, $subtype=null) {
if ($component === 'core') {
return new core_renderer($page);
} else {
$class = $this->standard_renderer_class_for_plugin($component, $subtype);
return new $class($page, $this->get_renderer('core', $page));
public function get_renderer(moodle_page $page, $component, $subtype=null) {
$classname = $this->standard_renderer_classname($component, $subtype);
if (!class_exists($classname)) {
throw new coding_exception('Request for an unknown renderer class ' . $classname);
}
return new $classname($page);
}
}
/**
* This is a slight variation on the standard_renderer_factory used by CLI scripts.
* CLI renderers use suffic '_cli' added to the standard renderer names
*
* @copyright 2009 Tim Hunt
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.0
*/
class cli_renderer_factory extends standard_renderer_factory {
class cli_renderer_factory extends renderer_factory_base {
/**
* Implement the subclass method
* @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 $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @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, $subtype=null) {
if ($component === 'core') {
return new cli_core_renderer($page);
} else {
parent::get_renderer($component, $page, $subtype);
public function get_renderer(moodle_page $page, $component, $subtype=null) {
$classname = $this->standard_renderer_classname($component, $subtype);
if (class_exists($classname . '_cli')) {
$classname = $classname . '_cli';
} else if (!class_exists($classname)) {
throw new coding_exception('Request for an unknown renderer class ' . $classname);
}
return new $classname($page);
}
}
@@ -199,7 +213,8 @@ class cli_renderer_factory extends standard_renderer_factory {
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.0
*/
class theme_overridden_renderer_factory extends standard_renderer_factory {
class theme_overridden_renderer_factory extends renderer_factory_base {
protected $prefixes = array();
/**
@@ -214,32 +229,26 @@ class theme_overridden_renderer_factory extends standard_renderer_factory {
/**
* Implement the subclass method
* @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 $component name such as 'core', 'mod_forum' or 'qtype_multichoice'.
* @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, $subtype=null) {
if (strpos($component, 'mod_') === 0) {
$component = substr($component, 4);
public function get_renderer(moodle_page $page, $component, $subtype=null) {
$classname = $this->standard_renderer_classname($component, $subtype);
if (!class_exists($classname)) {
// standard renderer must always exist
throw new coding_exception('Request for an unknown renderer class ' . $classname);
}
foreach ($this->prefixes as $prefix) {
// theme lib.php files are loaded automatically
if (is_null($subtype)) {
$classname = $prefix . '_' . $component . '_renderer';
} else {
$classname = $prefix . '_' . $component . '_' . $subtype . '_renderer';
}
if (class_exists($classname)) {
if ($component === 'core') {
return new $classname($page);
} else {
return new $classname($page, $this->get_renderer('core', $page));
}
// theme lib.php and renderers.php files are loaded automatically
if (class_exists($prefix . '_' . $classname)) {
$classname = $prefix . '_' . $classname;
return new $classname($page);
}
}
// use standard renderes if themes do not contain overridden renderer
return parent::get_renderer($component, $page, $subtype);
return new $classname($page);
}
}
+3 -3
View File
@@ -906,12 +906,12 @@ class theme_config {
/**
* Get the renderer for a part of Moodle for this theme.
* @param string $module the name of part of moodle. E.g. 'core', 'quiz', 'qtype_multichoice'.
* @param moodle_page $page the page we are rendering
* @param string $module the name of part of moodle. E.g. 'core', 'quiz', 'qtype_multichoice'.
* @param string $subtype optional subtype such as 'news' resulting to 'mod_forum_news'
* @return renderer_base the requested renderer.
*/
public function get_renderer($module, $page, $subtype=null) {
public function get_renderer(moodle_page $page, $component, $subtype=null) {
if (is_null($this->rf)) {
if (CLI_SCRIPT) {
$classname = 'cli_renderer_factory';
@@ -921,7 +921,7 @@ class theme_config {
$this->rf = new $classname($this);
}
return $this->rf->get_renderer($module, $page, $subtype);
return $this->rf->get_renderer($page, $component, $subtype);
}
/**
+2 -2
View File
@@ -47,7 +47,7 @@ class renderer_base {
* Constructor
* @param moodle_page $page the page we are doing output for.
*/
public function __construct($page) {
public function __construct(moodle_page $page) {
$this->opencontainers = $page->opencontainers;
$this->page = $page;
}
@@ -2072,7 +2072,7 @@ class core_renderer extends renderer_base {
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 2.0
*/
class cli_core_renderer extends core_renderer {
class core_renderer_cli extends core_renderer {
/**
* Returns the page header.
* @return string HTML fragment
+11 -1
View File
@@ -167,6 +167,16 @@ class moodle_page {
*/
protected $_legacypageobject = null;
/**
* Returns instance of page renderer
* @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 renderer_base
*/
public function find_renderer($component, $subtype = null) {
return $this->get_theme()->get_renderer($this, $component, $subtype);
}
/// Getter methods =============================================================
/// Due to the __get magic below, you normally do not call these as $PAGE->get_x
/// methods, but instead use the $PAGE->x syntax.
@@ -1039,7 +1049,7 @@ class moodle_page {
if ($this === $PAGE) {
$THEME = $this->_theme;
$OUTPUT = $this->_theme->get_renderer('core', $this);
$OUTPUT = $this->find_renderer('core');
}
$this->_wherethemewasinitialised = debug_backtrace();
+3 -4
View File
@@ -34,7 +34,7 @@
class mod_forum_renderer extends renderer_base {
/**
* A reference to the current general renderer probably {@see moodle_core_renderer}
* A reference to the current general renderer probably {@see core_renderer}
* @var renderer_base
*/
protected $output;
@@ -42,11 +42,10 @@ class mod_forum_renderer extends renderer_base {
/**
* Contructor method, calls the parent constructor
* @param moodle_page $page
* @param renderer_base $output Probably moodle_core_renderer
*/
public function __construct($page, $output) {
public function __construct(moodle_page $page) {
$this->output = $page->find_renderer('core');
parent::__construct($page);
$this->output = $output;
}
/**
+1 -1
View File
@@ -56,7 +56,7 @@ unset($SESSION->fromdiscussion);
add_to_log($course->id, "forum", "view subscribers", "subscribers.php?id=$forum->id", $forum->id, $cm->id);
$forumoutput = $PAGE->theme->get_renderer('mod_forum', $PAGE);
$forumoutput = $PAGE->find_renderer('mod_forum');
$currentgroup = groups_get_activity_group($cm);
$options = array('forumid'=>$forum->id, 'currentgroup'=>$currentgroup, 'context'=>$context);
$existingselector = new forum_existing_subscriber_selector('existingsubscribers', $options);
+1 -1
View File
@@ -40,7 +40,7 @@ require_sesskey();
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$canmanage = has_capability('mod/lesson:manage', $context);
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
$url = new moodle_url($CFG->wwwroot.'/mod/lesson/continue.php', array('id'=>$cm->id));
$PAGE->set_url($url);
+1 -1
View File
@@ -45,7 +45,7 @@ if ($mode != get_user_preferences('lesson_view', 'collapsed') && $mode !== 'sing
set_user_preference('lesson_view', $mode);
}
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
$PAGE->navbar->add(get_string('edit'));
echo $lessonoutput->header($lesson, $mode);
if (!$lesson->has_pages()) {
+1 -1
View File
@@ -98,7 +98,7 @@ if ($data = $mform->get_data()) {
redirect(new moodle_url($CFG->wwwroot.'/mod/lesson/edit.php', array('id'=>$cm->id)));
}
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
echo $lessonoutput->header($lesson);
$mform->display();
echo $lessonoutput->footer();
+1 -1
View File
@@ -277,7 +277,7 @@ switch ($mode) {
// Log it
add_to_log($course->id, 'lesson', 'view grade', "essay.php?id=$cm->id", get_string('manualgrading', 'lesson'), $cm->id);
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
echo $lessonoutput->header($lesson, 'essay');
switch ($mode) {
+1 -1
View File
@@ -161,7 +161,7 @@ switch ($mode) {
// Log it
add_to_log($course->id, 'lesson', 'view highscores', "highscores.php?id=$cm->id", $lesson->name, $cm->id);
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
echo $lessonoutput->header($lesson, 'highscores');
switch ($mode) {
+1 -1
View File
@@ -52,7 +52,7 @@ $context = get_context_instance(CONTEXT_MODULE, $cm->id);
require_capability('mod/lesson:edit', $context);
require_sesskey();
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
/// Process the action
switch ($action) {
+1 -1
View File
@@ -52,7 +52,7 @@ try {
require_login($course, false, $cm);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
// Get the mimetype
$mimetype = mimeinfo("type", $lesson->mediafile);
+2 -3
View File
@@ -34,11 +34,10 @@ class mod_lesson_renderer extends renderer_base {
/**
* Contructor method, calls the parent constructor
* @param moodle_page $page
* @param renderer_base $output Probably moodle_core_renderer
*/
public function __construct($page, $output) {
public function __construct(moodle_page $page) {
$this->output = $page->find_renderer('core');
parent::__construct($page);
$this->output = $output;
}
/**
+1 -1
View File
@@ -75,7 +75,7 @@ if ($pageid !== NULL) {
}
$PAGE->set_url($url);
$PAGE->navbar->add(get_string('reports', 'lesson'), new moodle_url($CFG->wwwroot.'/mod/lesson/report.php', array('id'=>$id)));
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
/// Process any form data before fetching attempts, grades and times
if (has_capability('mod/lesson:edit', $context) && $form = data_submitted() && confirm_sesskey()) {
+1 -1
View File
@@ -51,7 +51,7 @@ $PAGE->set_url($url);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
$canmanage = has_capability('mod/lesson:manage', $context);
$lessonoutput = $PAGE->theme->get_renderer('mod_lesson', $PAGE);
$lessonoutput = $PAGE->find_renderer('mod_lesson');
/// Check these for students only TODO: Find a better method for doing this!
/// Check lesson availability
+3 -2
View File
@@ -16,11 +16,12 @@ class custom_corners_renderer_factory extends standard_renderer_factory {
global $CFG;
require_once($CFG->themedir . '/custom_corners/renderers.php');
}
/* Implement the subclass method. */
public function get_renderer($module, $page, $subtype=null) {
public function get_renderer(moodle_page $page, $module, $subtype=null) {
if ($module == 'core') {
return new custom_corners_core_renderer($page);
}
return parent::get_renderer($module, $page, $subtype);
return parent::get_renderer($page, $module, $subtype);
}
}
@@ -29,6 +29,21 @@
class core_wsdoc_renderer extends renderer_base {
/**
* A reference to the current general renderer probably {@see core_renderer}
* @var renderer_base
*/
protected $output;
/**
* Contructor method, calls the parent constructor
* @param moodle_page $page
*/
public function __construct(moodle_page $page) {
$this->output = $page->find_renderer('core');
parent::__construct($page);
}
/**
* Create documentation for a description object
* @param object $params a part of parameter/return description
+2 -3
View File
@@ -25,7 +25,6 @@ define('NO_DEBUG_DISPLAY', true);
define('NO_MOODLE_COOKIES', true);
require_once('../config.php');
require_once('./wsdocrenderer.php');
require_once('lib.php');
@@ -241,7 +240,7 @@ class webservice_documentation_generator {
$USER->id = null;
echo $OUTPUT->header();
$USER->id = $userid;
$renderer = $PAGE->theme->get_renderer('core_wsdoc',$OUTPUT);
$renderer = $PAGE->find_renderer('core', 'wsdoc');
echo $renderer->documentation_html($this->functions, $this->username);
echo $OUTPUT->footer();
@@ -265,7 +264,7 @@ class webservice_documentation_generator {
$PAGE->set_pagelayout('popup');
echo $OUTPUT->header();
$renderer = $PAGE->theme->get_renderer('core_wsdoc',$OUTPUT);
$renderer = $PAGE->find_renderer('core', 'wsdoc');
echo $renderer->login_page_html($errormessage);
echo $OUTPUT->footer();