Use autoloading for plugin classes

This commit is contained in:
Adrian Lang 2011-06-06 16:20:29 +02:00
parent 1b595a184f
commit d54ac87747
2 changed files with 17 additions and 17 deletions

View file

@ -43,7 +43,7 @@ require_once(DOKU_INC.'inc/auth.php');
* require()s their associated php files when an object is instantiated.
*
* @author Andreas Gohr <andi@splitbrain.org>
* @todo add generic loading of plugins and other generically named classes
* @todo add generic loading of renderers and auth backends
*/
function load_autoload($name){
static $classes = null;
@ -87,5 +87,16 @@ function load_autoload($name){
require_once($classes[$name]);
return;
}
// Plugin loading
if(preg_match('/^(helper|syntax|action|admin|renderer)_plugin_([^_]+)(?:_([^_]+))?$/',
$name, $m)) {
//try to load the wanted plugin file
// include, but be silent. Maybe some other autoloader has an idea
// how to load this class.
$c = ((count($m) === 4) ? "/{$m[3]}" : '');
@include DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
return;
}
}

View file

@ -72,32 +72,21 @@ class Doku_Plugin_Controller {
return null;
}
$class = $type.'_plugin_'.$name;
//plugin already loaded?
if(!empty($DOKU_PLUGINS[$type][$name])){
if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
$class = $type.'_plugin_'.$name;
return class_exists($class) ? new $class : null;
return class_exists($class, true) ? new $class : null;
} else {
return $DOKU_PLUGINS[$type][$name];
}
}
//try to load the wanted plugin file
$dir = $this->get_directory($plugin);
$file = $component ? "$type/$component.php" : "$type.php";
if(!is_file(DOKU_PLUGIN."$dir/$file")){
return null;
}
if (!include_once(DOKU_PLUGIN."$dir/$file")) {
return null;
}
//construct class and instantiate
$class = $type.'_plugin_'.$name;
if (!class_exists($class)){
if (!class_exists($class, true)) {
# the plugin might be in the wrong directory
$dir = $this->get_directory($plugin);
$inf = confToHash(DOKU_PLUGIN."$dir/plugin.info.txt");
if($inf['base'] && $inf['base'] != $plugin){
msg("Plugin installed incorrectly. Rename plugin directory '".