MDL-41398 output: implemented maintenance renderer
[moodle.git] / lib / outputfactories.php
index bb854f4..b06ee92 100644 (file)
@@ -31,6 +31,9 @@ defined('MOODLE_INTERNAL') || die();
 /** General rendering target, usually normal browser page */
 define('RENDERER_TARGET_GENERAL', 'general');
 
+/** General rendering target, usually normal browser page, but with limited capacity to avoid API use */
+define('RENDERER_TARGET_MAINTENANCE', 'maintenance');
+
 /** Plain text rendering for CLI scripts and cron */
 define('RENDERER_TARGET_CLI', 'cli');
 
@@ -130,8 +133,10 @@ abstract class renderer_factory_base implements renderer_factory {
      * @return array two element array, first element is target, second the target suffix string
      */
     protected function get_target_suffix($target) {
-        if (empty($target)) {
-            // automatically guessed defaults
+        if (empty($target) || $target === RENDERER_TARGET_MAINTENANCE) {
+            // If the target hasn't been specified we need to guess the defaults.
+            // We also override the target with the default if the maintenance target has been provided.
+            // This ensures we don't use the maintenance renderer if we are processing a special target.
             if (CLI_SCRIPT) {
                 $target = RENDERER_TARGET_CLI;
             } else if (AJAX_SCRIPT) {
@@ -144,6 +149,7 @@ abstract class renderer_factory_base implements renderer_factory {
             case RENDERER_TARGET_AJAX: $suffix = '_ajax'; break;
             case RENDERER_TARGET_TEXTEMAIL: $suffix = '_textemail'; break;
             case RENDERER_TARGET_HTMLEMAIL: $suffix = '_htmlemail'; break;
+            case RENDERER_TARGET_MAINTENANCE: $suffix = '_maintenance'; break;
             default: $target = RENDERER_TARGET_GENERAL; $suffix = '';
         }
 
@@ -160,11 +166,12 @@ 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_news'
      * @return string the name of the standard renderer class for that module.
+     * @throws coding_exception
      */
     protected function standard_renderer_classname($component, $subtype = null) {
-        global $CFG; // needed in included files
+        global $CFG; // Needed in included files.
 
-        // standardize component name ala frankenstyle
+        // Standardize component name ala frankenstyle.
         list($plugin, $type) = core_component::normalize_component($component);
         if ($type === null) {
             $component = $plugin;
@@ -173,9 +180,9 @@ abstract class renderer_factory_base implements renderer_factory {
         }
 
         if ($component !== 'core') {
-            // renderers are stored in renderer.php files
+            // Renderers are stored in renderer.php files.
             if (!$compdirectory = core_component::get_component_directory($component)) {
-                throw new coding_exception('Invalid component specified in renderer request');
+                throw new coding_exception('Invalid component specified in renderer request', $component);
             }
             $rendererfile = $compdirectory . '/renderer.php';
             if (file_exists($rendererfile)) {
@@ -185,7 +192,7 @@ abstract class renderer_factory_base implements renderer_factory {
         } else if (!empty($subtype)) {
             $coresubsystems = core_component::get_core_subsystems();
             if (!array_key_exists($subtype, $coresubsystems)) { // There may be nulls.
-                throw new coding_exception('Invalid core subtype "' . $subtype . '" in renderer request');
+                throw new coding_exception('Invalid core subtype "' . $subtype . '" in renderer request', $subtype);
             }
             if ($coresubsystems[$subtype]) {
                 $rendererfile = $coresubsystems[$subtype] . '/renderer.php';