/** * Loads all the registered plugins. */ function load_plugins() { global $conf, $pwg_loaded_plugins; $pwg_loaded_plugins = array(); if ($conf['enable_plugins']) { $plugins = get_db_plugins('active'); foreach ($plugins as $plugin) { // include main from a function to avoid using same function context load_plugin($plugin); } trigger_notify('plugins_loaded'); } }
/** * Perform requested actions * @param string - action * @param string - plugin id * @param array - errors */ function perform_action($action, $plugin_id, $options = array()) { if (isset($this->db_plugins_by_id[$plugin_id])) { $crt_db_plugin = $this->db_plugins_by_id[$plugin_id]; } if ($action !== 'update') { // wait for files to be updated $plugin_maintain = self::build_maintain_class($plugin_id); } $errors = array(); switch ($action) { case 'install': if (!empty($crt_db_plugin) or !isset($this->fs_plugins[$plugin_id])) { break; } $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'] . '\') ;'; pwg_query($query); } break; case 'update': $previous_version = $this->fs_plugins[$plugin_id]['version']; $errors[0] = $this->extract_plugin_files('upgrade', $options['revision'], $plugin_id); if ($errors[0] === 'ok') { $this->get_fs_plugin($plugin_id); // refresh plugins list $new_version = $this->fs_plugins[$plugin_id]['version']; $plugin_maintain = self::build_maintain_class($plugin_id); $plugin_maintain->update($previous_version, $new_version, $errors); if ($new_version != 'auto') { $query = ' UPDATE ' . PLUGINS_TABLE . ' SET version=\'' . $new_version . '\' WHERE id=\'' . $plugin_id . '\' ;'; pwg_query($query); } } break; case 'activate': if (!isset($crt_db_plugin)) { $errors = $this->perform_action('install', $plugin_id); list($crt_db_plugin) = get_db_plugins(null, $plugin_id); load_conf_from_db(); } elseif ($crt_db_plugin['state'] == 'active') { break; } if (empty($errors)) { $plugin_maintain->activate($crt_db_plugin['version'], $errors); } if (empty($errors)) { $query = ' UPDATE ' . PLUGINS_TABLE . ' SET state=\'active\' WHERE id=\'' . $plugin_id . '\' ;'; pwg_query($query); } break; case 'deactivate': if (!isset($crt_db_plugin) or $crt_db_plugin['state'] != 'active') { break; } $query = ' UPDATE ' . PLUGINS_TABLE . ' SET state=\'inactive\' WHERE id=\'' . $plugin_id . '\' ;'; pwg_query($query); $plugin_maintain->deactivate(); break; case 'uninstall': if (!isset($crt_db_plugin)) { break; } if ($crt_db_plugin['state'] == 'active') { $this->perform_action('deactivate', $plugin_id); } $query = ' DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\' ;'; pwg_query($query); $plugin_maintain->uninstall(); break; case 'restore': $this->perform_action('uninstall', $plugin_id); unset($this->db_plugins_by_id[$plugin_id]); $errors = $this->perform_action('activate', $plugin_id); break; case 'delete': if (!empty($crt_db_plugin)) { $this->perform_action('uninstall', $plugin_id); } if (!isset($this->fs_plugins[$plugin_id])) { break; } deltree(PHPWG_PLUGINS_PATH . $plugin_id, PHPWG_PLUGINS_PATH . 'trash'); break; } return $errors; }