feature 2998: Maintenance class for plugin
git-svn-id: http://piwigo.org/svn/trunk@25406 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
parent
88001efb90
commit
76fc9c27dc
3 changed files with 283 additions and 113 deletions
|
@ -21,6 +21,41 @@
|
|||
// | USA. |
|
||||
// +-----------------------------------------------------------------------+
|
||||
|
||||
/**
|
||||
* class DummyPlugin_maintain
|
||||
* used when a plugin uses the old procedural declaration of maintenance methods
|
||||
*/
|
||||
class DummyPlugin_maintain extends PluginMaintain
|
||||
{
|
||||
function install($plugin_version, &$errors=array())
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
function activate($plugin_version, &$errors=array())
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
function deactivate()
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
function uninstall()
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
|
||||
function __call($name, $arguments)
|
||||
{
|
||||
if (is_callable('plugin_'.$name))
|
||||
{
|
||||
array_unshift($arguments, $this->plugin_id);
|
||||
return call_user_func_array('plugin_'.$name, $arguments);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class plugins
|
||||
{
|
||||
var $fs_plugins = array();
|
||||
|
@ -41,6 +76,37 @@ class plugins
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the maintain class of a plugin
|
||||
* or build a new class with the procedural methods
|
||||
* @param string $plugin_id
|
||||
*/
|
||||
private static function build_maintain_class($plugin_id)
|
||||
{
|
||||
$file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain.inc.php';
|
||||
$classname = $plugin_id.'_maintain';
|
||||
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include_once($file_to_include);
|
||||
|
||||
if (class_exists($classname))
|
||||
{
|
||||
$plugin_maintain = new $classname($plugin_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
$plugin_maintain = new DummyPlugin_maintain($plugin_id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$plugin_maintain = new DummyPlugin_maintain($plugin_id);
|
||||
}
|
||||
|
||||
return $plugin_maintain;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform requested actions
|
||||
* @param string - action
|
||||
|
@ -53,7 +119,8 @@ class plugins
|
|||
{
|
||||
$crt_db_plugin = $this->db_plugins_by_id[$plugin_id];
|
||||
}
|
||||
$file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain.inc.php';
|
||||
|
||||
$plugin_maintain = self::build_maintain_class($plugin_id);
|
||||
|
||||
$errors = array();
|
||||
|
||||
|
@ -64,20 +131,15 @@ class plugins
|
|||
{
|
||||
break;
|
||||
}
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include_once($file_to_include);
|
||||
if (function_exists('plugin_install'))
|
||||
{
|
||||
plugin_install($plugin_id, $this->fs_plugins[$plugin_id]['version'], $errors);
|
||||
}
|
||||
}
|
||||
|
||||
$plugin_maintain->install($this->fs_plugins[$plugin_id]['version'], $errors);
|
||||
|
||||
if (empty($errors))
|
||||
{
|
||||
$query = '
|
||||
INSERT INTO ' . PLUGINS_TABLE . ' (id,version) VALUES (\''
|
||||
. $plugin_id . '\',\'' . $this->fs_plugins[$plugin_id]['version'] . '\'
|
||||
)';
|
||||
INSERT INTO '. PLUGINS_TABLE .' (id,version)
|
||||
VALUES (\''. $plugin_id .'\', \''. $this->fs_plugins[$plugin_id]['version'] .'\')
|
||||
;';
|
||||
pwg_query($query);
|
||||
}
|
||||
break;
|
||||
|
@ -93,20 +155,20 @@ INSERT INTO ' . PLUGINS_TABLE . ' (id,version) VALUES (\''
|
|||
{
|
||||
break;
|
||||
}
|
||||
if (empty($errors) and file_exists($file_to_include))
|
||||
|
||||
if (empty($errors))
|
||||
{
|
||||
include_once($file_to_include);
|
||||
if (function_exists('plugin_activate'))
|
||||
{
|
||||
plugin_activate($plugin_id, $crt_db_plugin['version'], $errors);
|
||||
}
|
||||
$plugin_maintain->activate($crt_db_plugin['version'], $errors);
|
||||
}
|
||||
|
||||
if (empty($errors))
|
||||
{
|
||||
$query = '
|
||||
UPDATE '. PLUGINS_TABLE .'
|
||||
SET state=\'active\', version=\''.$this->fs_plugins[$plugin_id]['version'].'\'
|
||||
WHERE id=\'' . $plugin_id . '\'';
|
||||
SET state=\'active\',
|
||||
version=\''. $this->fs_plugins[$plugin_id]['version'] .'\'
|
||||
WHERE id=\''. $plugin_id .'\'
|
||||
;';
|
||||
pwg_query($query);
|
||||
}
|
||||
break;
|
||||
|
@ -116,17 +178,15 @@ WHERE id=\'' . $plugin_id . '\'';
|
|||
{
|
||||
break;
|
||||
}
|
||||
|
||||
$query = '
|
||||
UPDATE ' . PLUGINS_TABLE . ' SET state=\'inactive\' WHERE id=\'' . $plugin_id . '\'';
|
||||
UPDATE '. PLUGINS_TABLE .'
|
||||
SET state=\'inactive\'
|
||||
WHERE id=\''. $plugin_id .'\'
|
||||
;';
|
||||
pwg_query($query);
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include_once($file_to_include);
|
||||
if (function_exists('plugin_deactivate'))
|
||||
{
|
||||
plugin_deactivate($plugin_id);
|
||||
}
|
||||
}
|
||||
|
||||
$plugin_maintain->deactivate();
|
||||
break;
|
||||
|
||||
case 'uninstall':
|
||||
|
@ -138,17 +198,14 @@ UPDATE ' . PLUGINS_TABLE . ' SET state=\'inactive\' WHERE id=\'' . $plugin_id .
|
|||
{
|
||||
$this->perform_action('deactivate', $plugin_id);
|
||||
}
|
||||
|
||||
$query = '
|
||||
DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
|
||||
DELETE FROM '. PLUGINS_TABLE .'
|
||||
WHERE id=\''. $plugin_id .'\'
|
||||
;';
|
||||
pwg_query($query);
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include_once($file_to_include);
|
||||
if (function_exists('plugin_uninstall'))
|
||||
{
|
||||
plugin_uninstall($plugin_id);
|
||||
}
|
||||
}
|
||||
|
||||
$plugin_maintain->uninstall();
|
||||
break;
|
||||
|
||||
case 'restore':
|
||||
|
@ -166,9 +223,11 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
|
|||
{
|
||||
break;
|
||||
}
|
||||
|
||||
deltree(PHPWG_PLUGINS_PATH . $plugin_id, PHPWG_PLUGINS_PATH . 'trash');
|
||||
break;
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,37 @@
|
|||
// | USA. |
|
||||
// +-----------------------------------------------------------------------+
|
||||
|
||||
/**
|
||||
* class DummyTheme_maintain
|
||||
* used when a theme uses the old procedural declaration of maintenance methods
|
||||
*/
|
||||
class DummyTheme_maintain extends ThemeMaintain
|
||||
{
|
||||
function activate($theme_version, &$errors=array())
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
function deactivate()
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
function delete()
|
||||
{
|
||||
return $this->__call(__FUNCTION__, func_get_args());
|
||||
}
|
||||
|
||||
function __call($name, $arguments)
|
||||
{
|
||||
if (is_callable('theme_'.$name))
|
||||
{
|
||||
array_unshift($arguments, $this->theme_id);
|
||||
return call_user_func_array('theme_'.$name, $arguments);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class themes
|
||||
{
|
||||
var $fs_themes = array();
|
||||
|
@ -40,6 +71,37 @@ class themes
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the maintain class of a theme
|
||||
* or build a new class with the procedural methods
|
||||
* @param string $theme_id
|
||||
*/
|
||||
private static function build_maintain_class($theme_id)
|
||||
{
|
||||
$file_to_include = PHPWG_THEMES_PATH.'/'.$theme_id.'/admin/maintain.inc.php';
|
||||
$classname = $theme_id.'_maintain';
|
||||
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include_once($file_to_include);
|
||||
|
||||
if (class_exists($classname))
|
||||
{
|
||||
$theme_maintain = new $classname($theme_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
$theme_maintain = new DummyTheme_maintain($theme_id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$theme_maintain = new DummyTheme_maintain($theme_id);
|
||||
}
|
||||
|
||||
return $theme_maintain;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform requested actions
|
||||
* @param string - action
|
||||
|
@ -55,7 +117,7 @@ class themes
|
|||
$crt_db_theme = $this->db_themes_by_id[$theme_id];
|
||||
}
|
||||
|
||||
$file_to_include = PHPWG_THEMES_PATH.'/'.$theme_id.'/admin/maintain.inc.php';
|
||||
$theme_maintain = self::build_maintain_class($theme_id);
|
||||
|
||||
$errors = array();
|
||||
|
||||
|
@ -85,7 +147,6 @@ class themes
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
if ($this->fs_themes[$theme_id]['mobile']
|
||||
and !empty($conf['mobile_theme'])
|
||||
and $conf['mobile_theme'] != $theme_id)
|
||||
|
@ -94,14 +155,7 @@ class themes
|
|||
break;
|
||||
}
|
||||
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include($file_to_include);
|
||||
if (function_exists('theme_activate'))
|
||||
{
|
||||
theme_activate($theme_id, $this->fs_themes[$theme_id]['version'], $errors);
|
||||
}
|
||||
}
|
||||
$theme_maintain->activate($this->fs_themes[$theme_id]['version'], $errors);
|
||||
|
||||
if (empty($errors))
|
||||
{
|
||||
|
@ -141,8 +195,7 @@ INSERT INTO '.THEMES_TABLE.'
|
|||
$new_theme = null;
|
||||
|
||||
$query = '
|
||||
SELECT
|
||||
id
|
||||
SELECT id
|
||||
FROM '.THEMES_TABLE.'
|
||||
WHERE id != \''.$theme_id.'\'
|
||||
;';
|
||||
|
@ -159,14 +212,7 @@ SELECT
|
|||
$this->set_default_theme($new_theme);
|
||||
}
|
||||
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include($file_to_include);
|
||||
if (function_exists('theme_deactivate'))
|
||||
{
|
||||
theme_deactivate($theme_id);
|
||||
}
|
||||
}
|
||||
$theme_maintain->deactivate();
|
||||
|
||||
$query = '
|
||||
DELETE
|
||||
|
@ -203,14 +249,7 @@ DELETE
|
|||
break;
|
||||
}
|
||||
|
||||
if (file_exists($file_to_include))
|
||||
{
|
||||
include($file_to_include);
|
||||
if (function_exists('theme_delete'))
|
||||
{
|
||||
theme_delete($theme_id);
|
||||
}
|
||||
}
|
||||
$theme_maintain->delete();
|
||||
|
||||
deltree(PHPWG_THEMES_PATH.$theme_id, PHPWG_THEMES_PATH . 'trash');
|
||||
break;
|
||||
|
|
|
@ -31,9 +31,118 @@ string.
|
|||
*/
|
||||
|
||||
define('PHPWG_PLUGINS_PATH', PHPWG_ROOT_PATH.'plugins/');
|
||||
|
||||
define('EVENT_HANDLER_PRIORITY_NEUTRAL', 50);
|
||||
|
||||
|
||||
/**
|
||||
* class PluginMaintain
|
||||
* used to declare maintenance methods of a plugin
|
||||
*/
|
||||
abstract class PluginMaintain
|
||||
{
|
||||
protected $plugin_id;
|
||||
|
||||
function __construct($id)
|
||||
{
|
||||
$this->plugin_id = $id;
|
||||
}
|
||||
|
||||
abstract function install($plugin_version, &$errors=array());
|
||||
abstract function activate($plugin_version, &$errors=array());
|
||||
abstract function deactivate();
|
||||
abstract function uninstall();
|
||||
|
||||
/*
|
||||
* test if a plugin needs to be updated and call a update function
|
||||
* @param: string $version, version exposed by the plugin
|
||||
* @param: string $on_update, name of a method to call when an update is needed
|
||||
* it receives the previous version as first parameter
|
||||
*/
|
||||
function autoUpdate($version, $on_update=null)
|
||||
{
|
||||
global $pwg_loaded_plugins;
|
||||
|
||||
$current_version = $pwg_loaded_plugins[$this->plugin_id]['version'];
|
||||
|
||||
if ( $version == 'auto' or $current_version == 'auto'
|
||||
or version_compare($current_version, $version, '<')
|
||||
)
|
||||
{
|
||||
if (!empty($on_update))
|
||||
{
|
||||
call_user_func(array(&$this, $on_update), $current_version);
|
||||
}
|
||||
|
||||
if ($version != 'auto')
|
||||
{
|
||||
$query = '
|
||||
UPDATE '. PLUGINS_TABLE .'
|
||||
SET version = "'. $version .'"
|
||||
WHERE id = "'. $this->plugin_id .'"
|
||||
;';
|
||||
pwg_query($query);
|
||||
|
||||
$pwg_loaded_plugins[$this->plugin_id]['version'] = $version;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* class ThemeMaintain
|
||||
* used to declare maintenance methods of a theme
|
||||
*/
|
||||
abstract class ThemeMaintain
|
||||
{
|
||||
protected $theme_id;
|
||||
|
||||
function __construct($id)
|
||||
{
|
||||
$this->theme_id = $id;
|
||||
}
|
||||
|
||||
abstract function activate($theme_version, &$errors=array());
|
||||
abstract function deactivate();
|
||||
abstract function delete();
|
||||
|
||||
/*
|
||||
* test if a theme needs to be updated and call a update function
|
||||
* @param: string $version, version exposed by the theme
|
||||
* @param: string $on_update, name of a method to call when an update is needed
|
||||
* it receives the previous version as first parameter
|
||||
*/
|
||||
function autoUpdate($version, $on_update=null)
|
||||
{
|
||||
$query = '
|
||||
SELECT version
|
||||
FROM '. THEMES_TABLE .'
|
||||
WHERE id = "'. $this->theme_id .'"
|
||||
;';
|
||||
list($current_version) = pwg_db_fetch_row(pwg_query($query));
|
||||
|
||||
if ( $version == 'auto' or $current_version == 'auto'
|
||||
or version_compare($current_version, $version, '<')
|
||||
)
|
||||
{
|
||||
if (!empty($on_update))
|
||||
{
|
||||
call_user_func(array(&$this, $on_update), $current_version);
|
||||
}
|
||||
|
||||
if ($version != 'auto')
|
||||
{
|
||||
$query = '
|
||||
UPDATE '. THEMES_TABLE .'
|
||||
SET version = "'. $version .'"
|
||||
WHERE id = "'. $this->theme_id .'"
|
||||
;';
|
||||
pwg_query($query);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Register a event handler.
|
||||
* @param string $event the name of the event to listen to
|
||||
* @param mixed $func the function that will handle the event
|
||||
|
@ -253,41 +362,4 @@ function load_plugins()
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* test if a plugin needs to be updated and call a update function
|
||||
* @param: string $plugin_id, id of the plugin as seen in PLUGINS_TABLE and $pwg_loaded_plugins
|
||||
* @param: string $version, version exposed by the plugin
|
||||
* @param: callable $on_update, function to call when and update is needed
|
||||
* it receives the previous version as first parameter
|
||||
*/
|
||||
function request_plugin_update($plugin_id, $version, $on_update)
|
||||
{
|
||||
global $pwg_loaded_plugins;
|
||||
|
||||
if (
|
||||
$version == 'auto' or
|
||||
$pwg_loaded_plugins[$plugin_id]['version'] == 'auto' or
|
||||
version_compare($pwg_loaded_plugins[$plugin_id]['version'], $version, '<')
|
||||
)
|
||||
{
|
||||
// call update function
|
||||
if (!empty($on_update))
|
||||
{
|
||||
call_user_func($on_update, $pwg_loaded_plugins[$plugin_id]['version']);
|
||||
}
|
||||
|
||||
// update plugin version in database
|
||||
if ($version != 'auto')
|
||||
{
|
||||
$query = '
|
||||
UPDATE '. PLUGINS_TABLE .'
|
||||
SET version = "'. $version .'"
|
||||
WHERE id = "'. $plugin_id .'"';
|
||||
pwg_query($query);
|
||||
|
||||
$pwg_loaded_plugins[$plugin_id]['version'] = $version;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Loading…
Reference in a new issue