MDL-26105 block setting, improvement, replace switch-case with get_core_subsystems + get_plugin_types

This commit is contained in:
Sam Hemelryk
2011-06-09 13:51:14 +08:00
committed by Andrew Davis (andyjdavis)
parent b1627a92e5
commit 32a510de4e
+101 -66
View File
@@ -1558,78 +1558,53 @@ function matching_page_type_patterns($pagetype) {
*/
function generate_page_type_patterns($pagetype, $parentcontext = null, $currentcontext = null) {
global $CFG;
// always includes current page type: $PAGE->pagetype
// if plugin callbacks defined, it will be overwriten by a property description
$patterns = array($pagetype=>$pagetype);
$bits = explode('-', $pagetype);
switch ($bits[0]) {
case 'mod':
// for modules
$modname = $bits[1];
require_once("$CFG->dirroot/mod/$modname/lib.php");
$listfunction = $modname . '_pagetypelist';
if (function_exists($listfunction)) {
$module_pagetype = $listfunction($pagetype, $parentcontext, $currentcontext);
if ($parentcontext->contextlevel == CONTEXT_COURSE) {
// including course page type
require_once("$CFG->dirroot/course/lib.php");
return array_merge(course_pagetypelist($pagetype, $parentcontext, $currentcontext), $module_pagetype);
} else {
return $module_pagetype;
}
} else {
// if modules don't have callbacks
// generate two default page type patterns for modules only
if ($bits[2] == 'view') {
$patterns['mod-*-view'] = get_string('page-mod-x-view', 'pagetype');
} else if ($bits[2] == 'index') {
$patterns['mod-*-index'] = get_string('page-mod-x-index', 'pagetype');
}
$component = clean_param(reset($bits), PARAM_ALPHANUMEXT);
$function = 'default_pagetypelist';
$core = get_core_subsystems();
$plugins = get_plugin_types();
// First check to see if the initial component is a core component
// if its not check to see if it is a plugin component.
if (array_key_exists($component, $core) && !empty($core[$component])) {
$libfile = $CFG->dirroot.'/'.$core[$component].'/lib.php';
if (file_exists($libfile)) {
require_once($libfile);
if (function_exists($component.'_pagetypelist')) {
$function = $component.'_pagetypelist';
}
break;
case 'my':
case 'user':
require_once("$CFG->dirroot/user/lib.php");
return user_pagetypelist($pagetype, $parentcontext, $currentcontext);
break;
case 'course':
require_once("$CFG->dirroot/course/lib.php");
return course_pagetypelist($pagetype, $parentcontext, $currentcontext);
break;
case 'tag':
require_once("$CFG->dirroot/tag/lib.php");
return tag_pagetypelist($pagetype, $parentcontext, $currentcontext);
break;
case 'blog':
require_once("$CFG->dirroot/blog/lib.php");
return blog_pagetypelist($pagetype, $parentcontext, $currentcontext);
break;
case 'note':
require_once("$CFG->dirroot/notes/lib.php");
return note_pagetypelist($pagetype, $parentcontext, $currentcontext);
break;
case 'question':
require_once("$CFG->libdir/questionlib.php");
return question_pagetypelist($pagetype, $parentcontext, $currentcontext);
break;
case 'local':
require_once("$CFG->dirroot/local/{$bits[1]}/lib.php");
$functionname = 'local_' . $bits[1] . '_pagetypelist';
if (function_exists($functionname)) {
return $functionname($pagetype, $parentcontext, $currentcontext);
}
break;
}
} else if (array_key_exists($component, $plugins) && !empty($plugins[$component])) {
$function = 'plugin_pagetypelist';
if (function_exists($component.'_pagetypelist')) {
$function = $component.'_pagetypelist';
}
}
// Call the most appropriate function we could determine
$patterns = $function($pagetype, $parentcontext, $currentcontext);
if (empty($patterns)) {
// If there are no patterns default to just the current pattern.
$patterns = array($pagetype => $pagetype);
}
return $patterns;
}
/**
* Generates a default page type list when a more appropriate callback cannot be decided upon.
*
* @param string $pagetype
* @param stdClass $parentcontext
* @param stdClass $currentcontext
* @return array
*/
function default_pagetypelist($pagetype, $parentcontext = null, $currentcontext = null) {
// Generate page type patterns based on current page type if
// callbacks haven't been defined
$patterns = array($pagetype => $pagetype);
$bits = explode('-', $pagetype);
while (count($bits) > 0) {
$pattern = implode('-', $bits) . '-*';
$pagetypestringname = 'page-'.str_replace('*', 'x', $pattern);
@@ -1645,6 +1620,66 @@ function generate_page_type_patterns($pagetype, $parentcontext = null, $currentc
return $patterns;
}
/**
* Generates a page type list for plugins
*
* @param string $pagetype
* @param stdClass $parentcontext
* @param stdClass $currentcontext
* @return array
*/
function plugin_pagetypelist($pagetype, $parentcontext = null, $currentcontext = null) {
// for modules
$bits = explode('-', $pagetype);
$plugintype = $bits[0];
$pluginname = $bits[1];
$directory = get_plugin_directory($plugintype, $pluginname);
if (empty($directory)) {
return array();
}
$libfile = $directory.'/lib.php';
require_once($libfile);
$function = $pluginname.'_pagetypelist';
if (!function_exists($function)) {
return array();
}
$patterns = $function($pagetype, $parentcontext, $currentcontext);
if ($parentcontext->contextlevel == CONTEXT_COURSE) {
// including course page type
require_once("$CFG->dirroot/course/lib.php");
$patterns = array_merge(course_pagetypelist($pagetype, $parentcontext, $currentcontext), $module_pagetype);
}
return $patterns;
}
/**
* Generates the page type list for a module by either locating and using the modules callback
* or by generating a default list.
*
* @param string $pagetype
* @param stdClass $parentcontext
* @param stdClass $currentcontext
* @return array
*/
function mod_pagetypelist($pagetype, $parentcontext = null, $currentcontext = null) {
$patterns = plugin_pagetypelist($pagetype, $parentcontext, $currentcontext);
if (empty($patterns)) {
// if modules don't have callbacks
// generate two default page type patterns for modules only
$bits = explode('-', $pagetype);
$patterns = array($pagetype => $pagetype);
if ($bits[2] == 'view') {
$patterns['mod-*-view'] = get_string('page-mod-x-view', 'pagetype');
} else if ($bits[2] == 'index') {
$patterns['mod-*-index'] = get_string('page-mod-x-index', 'pagetype');
}
}
return $patterns;
}
function my_pagetypelist($pagetype, $parentcontext = null, $currentcontext = null) {
}
/// Functions update the blocks if required by the request parameters ==========
/**