Skip to content

Commit

Permalink
feature 2998: Maintenance class for plugin
Browse files Browse the repository at this point in the history
git-svn-id: http://piwigo.org/svn/trunk@25406 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information
mistic100 committed Nov 8, 2013
1 parent 88001ef commit 76fc9c2
Show file tree
Hide file tree
Showing 3 changed files with 283 additions and 113 deletions.
153 changes: 106 additions & 47 deletions admin/include/plugins.class.php
Expand Up @@ -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();
Expand All @@ -30,7 +65,7 @@ class plugins

/**
* Initialize $fs_plugins and $db_plugins_by_id
*/
*/
function plugins()
{
$this->get_fs_plugins();
Expand All @@ -41,19 +76,51 @@ function 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();

Expand All @@ -64,20 +131,15 @@ function perform_action($action, $plugin_id)
{
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;
Expand All @@ -93,20 +155,20 @@ function perform_action($action, $plugin_id)
{
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;
Expand All @@ -116,17 +178,15 @@ function perform_action($action, $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':
Expand All @@ -138,17 +198,14 @@ function perform_action($action, $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':
Expand All @@ -166,15 +223,17 @@ function perform_action($action, $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);
Expand Down
95 changes: 67 additions & 28 deletions admin/include/themes.class.php
Expand Up @@ -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();
Expand All @@ -40,6 +71,37 @@ function 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
Expand All @@ -55,7 +117,7 @@ function perform_action($action, $theme_id)
$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();

Expand Down Expand Up @@ -85,7 +147,6 @@ function perform_action($action, $theme_id)
break;
}


if ($this->fs_themes[$theme_id]['mobile']
and !empty($conf['mobile_theme'])
and $conf['mobile_theme'] != $theme_id)
Expand All @@ -94,14 +155,7 @@ function perform_action($action, $theme_id)
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))
{
Expand Down Expand Up @@ -141,8 +195,7 @@ function perform_action($action, $theme_id)
$new_theme = null;

$query = '
SELECT
id
SELECT id
FROM '.THEMES_TABLE.'
WHERE id != \''.$theme_id.'\'
;';
Expand All @@ -159,14 +212,7 @@ function perform_action($action, $theme_id)
$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
Expand Down Expand Up @@ -203,14 +249,7 @@ function perform_action($action, $theme_id)
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;
Expand Down

0 comments on commit 76fc9c2

Please sign in to comment.