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:
+1
-1
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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()) {
|
||||
|
||||
@@ -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();
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user