Fix regression where require_plugin() wasn't initializing the plugin

pull/229/merge
Aleksander Machniak 10 years ago
parent 4e3de10274
commit 6c8cbe3ee5

@ -43,6 +43,7 @@ class rcube_plugin_api
public $active_plugins = array(); public $active_plugins = array();
protected $plugins = array(); protected $plugins = array();
protected $plugins_initialized = array();
protected $tasks = array(); protected $tasks = array();
protected $actions = array(); protected $actions = array();
protected $actionmap = array(); protected $actionmap = array();
@ -96,6 +97,7 @@ class rcube_plugin_api
// ... task, request type and framed mode // ... task, request type and framed mode
if (!$this->filter($plugin)) { if (!$this->filter($plugin)) {
$plugin->init(); $plugin->init();
$this->plugins_initialized[$plugin->ID] = $plugin;
} }
} }
@ -130,7 +132,7 @@ class rcube_plugin_api
// load required core plugin if no derivate was found // load required core plugin if no derivate was found
if (!$loaded) { if (!$loaded) {
$loaded = $this->load_plugin($plugin_name); $loaded = $this->load_plugin($plugin_name, true);
} }
// trigger fatal error if still not loaded // trigger fatal error if still not loaded
@ -146,7 +148,7 @@ class rcube_plugin_api
/** /**
* Load the specified plugin * Load the specified plugin
* *
* @param string Plugin name * @param string Plugin name
* @param boolean Force loading of the plugin even if it doesn't match the filter * @param boolean Force loading of the plugin even if it doesn't match the filter
* @param boolean Require loading of the plugin, error if it doesn't exist * @param boolean Require loading of the plugin, error if it doesn't exist
* *
@ -161,63 +163,62 @@ class rcube_plugin_api
$plugins_dir = unslashify($dir->path); $plugins_dir = unslashify($dir->path);
} }
// plugin already loaded // plugin already loaded?
if ($this->plugins[$plugin_name]) { if (!$this->plugins[$plugin_name]) {
return true; $fn = "$plugins_dir/$plugin_name/$plugin_name.php";
}
if (!is_readable($fn)) {
if ($require) {
rcube::raise_error(array('code' => 520, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Failed to load plugin file $fn"), true, false);
}
$fn = "$plugins_dir/$plugin_name/$plugin_name.php"; return false;
}
if (is_readable($fn)) {
if (!class_exists($plugin_name, false)) { if (!class_exists($plugin_name, false)) {
include $fn; include $fn;
} }
// instantiate class if exists // instantiate class if exists
if (class_exists($plugin_name, false)) { if (!class_exists($plugin_name, false)) {
$plugin = new $plugin_name($this); rcube::raise_error(array('code' => 520, 'type' => 'php',
$this->active_plugins[] = $plugin_name; 'file' => __FILE__, 'line' => __LINE__,
'message' => "No plugin class $plugin_name found in $fn"),
// check inheritance... true, false);
if (is_subclass_of($plugin, 'rcube_plugin')) {
// ... task, request type and framed mode
// call onload method on plugin if it exists.
// this is useful if you want to be called early in the boot process
if (method_exists($plugin, 'onload')) {
$plugin->onload();
}
// init a plugin only if $force is set or if we're called after initialization return false;
if (($force || $this->initialized) }
&& !$this->filter($plugin))
{
$plugin->init();
}
$this->plugins[$plugin_name] = $plugin; $plugin = new $plugin_name($this);
$this->active_plugins[] = $plugin_name;
if (!empty($plugin->allowed_prefs)) { // check inheritance...
$this->allowed_prefs = array_merge($this->allowed_prefs, $plugin->allowed_prefs); if (is_subclass_of($plugin, 'rcube_plugin')) {
} // call onload method on plugin if it exists.
// this is useful if you want to be called early in the boot process
if (method_exists($plugin, 'onload')) {
$plugin->onload();
}
return true; if (!empty($plugin->allowed_prefs)) {
$this->allowed_prefs = array_merge($this->allowed_prefs, $plugin->allowed_prefs);
} }
}
else { $this->plugins[$plugin_name] = $plugin;
rcube::raise_error(array('code' => 520, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "No plugin class $plugin_name found in $fn"),
true, false);
} }
} }
else if ($require) {
rcube::raise_error(array('code' => 520, 'type' => 'php', if ($plugin = $this->plugins[$plugin_name]) {
'file' => __FILE__, 'line' => __LINE__, // init a plugin only if $force is set or if we're called after initialization
'message' => "Failed to load plugin file $fn"), true, false); if (($force || $this->initialized) && !$this->plugins_initialized[$plugin_name] && !$this->filter($plugin)) {
$plugin->init();
$this->plugins_initialized[$plugin_name] = $plugin;
}
} }
return false; return true;
} }
/** /**
@ -228,9 +229,9 @@ class rcube_plugin_api
*/ */
private function filter($plugin) private function filter($plugin)
{ {
return (($plugin->noajax && !(is_object($this->output) && $this->output->type == 'html') ) return ($plugin->noajax && !(is_object($this->output) && $this->output->type == 'html'))
|| ($plugin->task && !preg_match('/^('.$plugin->task.')$/i', $this->task)) || ($plugin->task && !preg_match('/^('.$plugin->task.')$/i', $this->task))
|| ($plugin->noframe && !empty($_REQUEST['_framed']))) ? true : false; || ($plugin->noframe && !empty($_REQUEST['_framed']));
} }
/** /**

Loading…
Cancel
Save