|
Moodle
2.2.1
http://www.collinsharper.com
|
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 }