aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormistic100 <mistic@piwigo.org>2013-11-08 23:29:38 +0000
committermistic100 <mistic@piwigo.org>2013-11-08 23:29:38 +0000
commit76fc9c27dcc0c9da1b12385027c2cc937f7f969e (patch)
tree2159ef548cade6230b95ab7368843f31265dce60
parent88001efb9042bbe8b1b0c7e9c46ad0f7a0919af5 (diff)
feature 2998: Maintenance class for plugin
git-svn-id: http://piwigo.org/svn/trunk@25406 68402e56-0260-453c-a942-63ccdbb3a9ee
-rw-r--r--admin/include/plugins.class.php153
-rw-r--r--admin/include/themes.class.php95
-rw-r--r--include/functions_plugins.inc.php148
3 files changed, 283 insertions, 113 deletions
diff --git a/admin/include/plugins.class.php b/admin/include/plugins.class.php
index 27a458d7d..197bed678 100644
--- a/admin/include/plugins.class.php
+++ b/admin/include/plugins.class.php
@@ -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();
@@ -30,7 +65,7 @@ class plugins
/**
* Initialize $fs_plugins and $db_plugins_by_id
- */
+ */
function plugins()
{
$this->get_fs_plugins();
@@ -41,19 +76,51 @@ 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
- * @param string - plugin id
- * @param array - errors
- */
+ * @param string - action
+ * @param string - plugin id
+ * @param array - errors
+ */
function perform_action($action, $plugin_id)
{
if (isset($this->db_plugins_by_id[$plugin_id]))
{
$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 . '\'';
+UPDATE '. PLUGINS_TABLE .'
+ 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,15 +223,17 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
{
break;
}
+
deltree(PHPWG_PLUGINS_PATH . $plugin_id, PHPWG_PLUGINS_PATH . 'trash');
break;
}
+
return $errors;
}
/**
- * Get plugins defined in the plugin directory
- */
+ * Get plugins defined in the plugin directory
+ */
function get_fs_plugins()
{
$dir = opendir(PHPWG_PLUGINS_PATH);
diff --git a/admin/include/themes.class.php b/admin/include/themes.class.php
index 52e465446..a86828057 100644
--- a/admin/include/themes.class.php
+++ b/admin/include/themes.class.php
@@ -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();
@@ -41,6 +72,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
* @param string - theme id
@@ -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;
diff --git a/include/functions_plugins.inc.php b/include/functions_plugins.inc.php
index 03dcbf851..62a4796ae 100644
--- a/include/functions_plugins.inc.php
+++ b/include/functions_plugins.inc.php
@@ -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;
- }
- }
-}
-
?> \ No newline at end of file