Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/lib/outputfactories.php
Go to the documentation of this file.
00001 <?php
00002 
00003 // This file is part of Moodle - http://moodle.org/
00004 //
00005 // Moodle is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // Moodle is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
00017 
00031 defined('MOODLE_INTERNAL') || die();
00032 
00034 define('RENDERER_TARGET_GENERAL', 'general');
00035 
00037 define('RENDERER_TARGET_CLI', 'cli');
00038 
00040 define('RENDERER_TARGET_AJAX', 'ajax');
00041 
00043 define('RENDERER_TARGET_TEXTEMAIL', 'textemail');
00044 
00046 define('RENDERER_TARGET_HTMLEMAIL', 'htmlemail');
00047 
00048 /* note: maybe we could define portfolio export target too */
00049 
00050 
00065 interface renderer_factory {
00091     public function get_renderer(moodle_page $page, $component, $subtype=null, $target=null);
00092 }
00093 
00094 
00108 abstract class renderer_factory_base implements renderer_factory {
00110     protected $theme;
00111 
00116     public function __construct(theme_config $theme) {
00117         $this->theme = $theme;
00118     }
00119 
00125     protected function get_target_suffix($target) {
00126         if (empty($target)) {
00127             // automatically guessed defaults
00128             if (CLI_SCRIPT) {
00129                 $target = RENDERER_TARGET_CLI;
00130             } else if (AJAX_SCRIPT) {
00131                 $target = RENDERER_TARGET_AJAX;
00132             }
00133         }
00134 
00135         switch ($target) {
00136             case RENDERER_TARGET_CLI: $suffix = '_cli'; break;
00137             case RENDERER_TARGET_AJAX: $suffix = '_ajax'; break;
00138             case RENDERER_TARGET_TEXTEMAIL: $suffix = '_textemail'; break;
00139             case RENDERER_TARGET_HTMLEMAIL: $suffix = '_htmlemail'; break;
00140             default: $target = RENDERER_TARGET_GENERAL; $suffix = '';
00141         }
00142 
00143         return array($target, $suffix);
00144     }
00145 
00157     protected function standard_renderer_classname($component, $subtype = null) {
00158         global $CFG; // needed in included files
00159 
00160         // standardize component name ala frankenstyle
00161         list($plugin, $type) = normalize_component($component);
00162         if ($type === null) {
00163             $component = $plugin;
00164         } else {
00165             $component = $plugin.'_'.$type;
00166         }
00167 
00168         if ($component !== 'core') {
00169             // renderers are stored in renderer.php files
00170             if (!$compdirectory = get_component_directory($component)) {
00171                 throw new coding_exception('Invalid component specified in renderer request');
00172             }
00173             $rendererfile = $compdirectory . '/renderer.php';
00174             if (file_exists($rendererfile)) {
00175                 include_once($rendererfile);
00176             }
00177 
00178         } else if (!empty($subtype)) {
00179             $coresubsystems = get_core_subsystems();
00180             if (!isset($coresubsystems[$subtype])) {
00181                 throw new coding_exception('Invalid core subtype "' . $subtype . '" in renderer request');
00182             }
00183             $rendererfile = $CFG->dirroot . '/' . $coresubsystems[$subtype] . '/renderer.php';
00184             if (file_exists($rendererfile)) {
00185                 include_once($rendererfile);
00186             }
00187         }
00188 
00189         if (empty($subtype)) {
00190             $class = $component . '_renderer';
00191         } else {
00192             $class = $component . '_' . $subtype . '_renderer';
00193         }
00194         return $class;
00195     }
00196 }
00197 
00198 
00207 class standard_renderer_factory extends renderer_factory_base {
00216     public function get_renderer(moodle_page $page, $component, $subtype = null, $target = null) {
00217         $classname = $this->standard_renderer_classname($component, $subtype);
00218         if (!class_exists($classname)) {
00219             throw new coding_exception('Request for an unknown renderer class ' . $classname);
00220         }
00221 
00222         list($target, $suffix) = $this->get_target_suffix($target);
00223         if (class_exists($classname . $suffix)) {
00224             // use the specialised renderer for given target, default renderer might also decide
00225             // to implement support for more targets
00226             $classname = $classname . $suffix;
00227         }
00228 
00229         return new $classname($page, $target);
00230     }
00231 }
00232 
00233 
00248 class theme_overridden_renderer_factory extends renderer_factory_base {
00249 
00250     protected $prefixes = array();
00251 
00256     public function __construct(theme_config $theme) {
00257         parent::__construct($theme);
00258         // Initialise $this->prefixes.
00259         $this->prefixes = $theme->renderer_prefixes();
00260     }
00261 
00270     public function get_renderer(moodle_page $page, $component, $subtype = null, $target = null) {
00271         $classname = $this->standard_renderer_classname($component, $subtype);
00272         if (!class_exists($classname)) {
00273             // standard renderer must always exist
00274             throw new coding_exception('Request for an unknown renderer class ' . $classname);
00275         }
00276 
00277         list($target, $suffix) = $this->get_target_suffix($target);
00278 
00279         // theme lib.php and renderers.php files are loaded automatically
00280         // when loading the theme configs
00281 
00282         // first try the renderers with correct suffix
00283         foreach ($this->prefixes as $prefix) {
00284             if (class_exists($prefix . '_' . $classname . $suffix)) {
00285                 $classname = $prefix . '_' . $classname . $suffix;
00286                 return new $classname($page, $target);
00287             }
00288         }
00289         if (class_exists($classname . $suffix)) {
00290             // use the specialised renderer for given target, default renderer might also decide
00291             // to implement support for more targets
00292             $classname = $classname . $suffix;
00293             return new $classname($page, $target);
00294         }
00295 
00296         // then try general renderer
00297         foreach ($this->prefixes as $prefix) {
00298             if (class_exists($prefix . '_' . $classname)) {
00299                 $classname = $prefix . '_' . $classname;
00300                 return new $classname($page, $target);
00301             }
00302         }
00303 
00304         return new $classname($page, $target);
00305     }
00306 }
 All Data Structures Namespaces Files Functions Variables Enumerations