From e4e0020ed6b5532e1bafdc55062110c36fd796a4 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Mon, 3 Oct 2011 14:32:34 +0100 Subject: [PATCH] MDL-29625 new helper function get_plugin_list_with_class. Based on the existing get_plugin_list_with_function. As part of implementing this, I refactored out a get_plugin_list_with_file function, which may also be useful. --- lib/moodlelib.php | 115 +++++++++++++++++++++++++++++++++------------- 1 file changed, 83 insertions(+), 32 deletions(-) diff --git a/lib/moodlelib.php b/lib/moodlelib.php index aa4891eba41..5f5e9350ed7 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -7453,45 +7453,96 @@ function get_plugin_list($plugintype) { } /** - * Gets a list of all plugin API functions for given plugin type, function - * name, and filename. - * @param string $plugintype Plugin type, e.g. 'mod' or 'report' - * @param string $function Name of function after the frankenstyle prefix; - * e.g. if the function is called report_courselist_hook then this value - * would be 'hook' - * @param string $file Name of file that includes function within plugin, - * default 'lib.php' - * @return Array of plugin frankenstyle (e.g. 'report_courselist', 'mod_forum') - * to valid, existing plugin function name (e.g. 'report_courselist_hook', - * 'forum_hook') + * Get a list of all the plugins of a given type that contain a particular file. + * @param string $plugintype the type of plugin, e.g. 'mod' or 'report'. + * @param string $file the name of file that must be present in the plugin. + * (e.g. 'view.php', 'db/install.xml'). + * @param bool $include if true (default false), the file will be include_once-ed if found. + * @return array with plugin name as keys (e.g. 'forum', 'courselist') and the path + * to the file relative to dirroot as value (e.g. "$CFG->dirroot/mod/forum/view.php"). */ -function get_plugin_list_with_function($plugintype, $function, $file='lib.php') { - global $CFG; // mandatory in case it is referenced by include()d PHP script +function get_plugin_list_with_file($plugintype, $file, $include = false) { + global $CFG; // Necessary in case it is referenced by include()d PHP scripts. - $result = array(); - // Loop through list of plugins with given type - $list = get_plugin_list($plugintype); - foreach($list as $plugin => $dir) { + $plugins = array(); + + foreach(get_plugin_list($plugintype) as $plugin => $dir) { $path = $dir . '/' . $file; - // If file exists, require it and look for function if (file_exists($path)) { - include_once($path); - $fullfunction = $plugintype . '_' . $plugin . '_' . $function; - if (function_exists($fullfunction)) { - // Function exists with standard name. Store, indexed by - // frankenstyle name of plugin - $result[$plugintype . '_' . $plugin] = $fullfunction; - } else if ($plugintype === 'mod') { - // For modules, we also allow plugin without full frankenstyle - // but just starting with the module name - $shortfunction = $plugin . '_' . $function; - if (function_exists($shortfunction)) { - $result[$plugintype . '_' . $plugin] = $shortfunction; - } + if ($include) { + include_once($path); + } + $plugins[$plugin] = $path; + } + } + + return $plugins; +} + +/** + * Get a list of all the plugins of a given type that define a certain API function + * in a certain file. The plugin component names and function names are returned. + * + * @param string $plugintype the type of plugin, e.g. 'mod' or 'report'. + * @param string $function the part of the name of the function after the + * frankenstyle prefix. e.g 'hook' if you are looking for functions with + * names like report_courselist_hook. + * @param string $file the name of file within the plugin that defines the + * function. Defaults to lib.php. + * @return array with frankenstyle plugin names as keys (e.g. 'report_courselist', 'mod_forum') + * and the function names as values (e.g. 'report_courselist_hook', 'forum_hook'). + */ +function get_plugin_list_with_function($plugintype, $function, $file = 'lib.php') { + $pluginfunctions = array(); + foreach (get_plugin_list_with_file($plugintype, $file, true) as $plugin => $notused) { + $fullfunction = $plugintype . '_' . $plugin . '_' . $function; + + if (function_exists($fullfunction)) { + // Function exists with standard name. Store, indexed by + // frankenstyle name of plugin + $pluginfunctions[$plugintype . '_' . $plugin] = $fullfunction; + + } else if ($plugintype === 'mod') { + // For modules, we also allow plugin without full frankenstyle + // but just starting with the module name + $shortfunction = $plugin . '_' . $function; + if (function_exists($shortfunction)) { + $pluginfunctions[$plugintype . '_' . $plugin] = $shortfunction; } } } - return $result; + return $pluginfunctions; +} + +/** + * Get a list of all the plugins of a given type that define a certain class + * in a certain file. The plugin component names and class names are returned. + * + * @param string $plugintype the type of plugin, e.g. 'mod' or 'report'. + * @param string $class the part of the name of the class after the + * frankenstyle prefix. e.g 'thing' if you are looking for classes with + * names like report_courselist_thing. If you are looking for classes with + * the same name as the plugin name (e.g. qtype_multichoice) then pass ''. + * @param string $file the name of file within the plugin that defines the class. + * @return array with frankenstyle plugin names as keys (e.g. 'report_courselist', 'mod_forum') + * and the class names as values (e.g. 'report_courselist_thing', 'qtype_multichoice'). + */ +function get_plugin_list_with_class($plugintype, $class, $file) { + if ($class) { + $suffix = '_' . $class; + } else { + $suffix = ''; + } + + $pluginclasses = array(); + foreach (get_plugin_list_with_file($plugintype, $file, true) as $plugin => $notused) { + $classname = $plugintype . '_' . $plugin . $suffix; + if (class_exists($classname)) { + $pluginclasses[$plugintype . '_' . $plugin] = $classname; + } + } + + return $pluginclasses; } /**