Permalink
Browse files

Add skeleton of the plugin architecture

By Leonardo Sapiras, reviewed, integrated, commited by ioguix.
  • Loading branch information...
1 parent a524be7 commit 3e282e6b49c9fb06d15a74bd83a5df2d5d63b3de @leonardosapiras leonardosapiras committed with ioguix Dec 5, 2011
Showing with 175 additions and 1 deletion.
  1. +36 −0 classes/Plugin.php
  2. +114 −0 classes/PluginManager.php
  3. +11 −1 conf/config.inc.php-dist
  4. +5 −0 lang/english.php
  5. +4 −0 libraries/lib.inc.php
  6. +5 −0 plugin.php
View
@@ -0,0 +1,36 @@
+<?php
+abstract class Plugin {
+
+ /**
+ * Constructor
+ * Register the plugin's functions in hooks of PPA.
+ * @param $language Current phpPgAdmin language.
+ */
+ function __construct($language) {
+ // Set the plugin's language
+ $plugin_directory = "plugins/". $this->get_name();
+ require_once("{$plugin_directory}/lang/recoded/english.php");
+ if (file_exists("{$plugin_directory}/lang/recoded/{$language}.php")) {
+ include_once("{$plugin_directory}/lang/recoded/{$language}.php");
+ }
+ $this->lang = $plugin_lang;
+
+ if (file_exists("{$plugin_directory}/conf/config.inc.php")) {
+ include_once("{$plugin_directory}/conf/config.inc.php");
+ $this->conf = $plugin_conf;
+ }
+ }
+
+ abstract function get_hooks();
+
+ abstract function get_actions();
+
+ /**
+ * Get the plugin name, that will be used as identification
+ * @return $name
+ */
+ function get_name() {
+ return $this->name;
+ }
+}
+?>
View
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * A class that implements the plugin's system
+ */
+
+class PluginManager {
+
+ /**
+ * Attributes
+ */
+ private $plugins_list = array();
+ private $available_hooks = array(/* wip, will be added in next commits */);
+ private $actions = array();
+ private $hooks = array();
+
+ /**
+ * Register the plugins
+ * @param $language - Language that have been used.
+ */
+ function __construct($language) {
+ global $conf, $lang;
+
+ // Get the activated plugins
+ $plugins = $conf['plugins'];
+
+ foreach ($plugins as $activated_plugin) {
+ $plugin_file = './plugins/'.$activated_plugin.'/plugin.php';
+
+ // Verify is the activated plugin exists
+ if (file_exists($plugin_file)) {
+ include_once($plugin_file);
+ $plugin = new $activated_plugin($language);
+ $this->add_plugin($plugin);
+ } else {
+ printf($lang['strpluginnotfound']."\t\n", $activated_plugin);
+ exit;
+ }
+ }
+ }
+
+ /**
+ * Add a plugin in the list of plugins to manage
+ * @param $plugin - Instance from plugin
+ */
+ function add_plugin($plugin) {
+ global $lang;
+
+ //The $plugin_name is the identification of the plugin.
+ //Example: PluginExample is the identification for PluginExample
+ //It will be used to get a specific plugin from the plugins_list.
+ $plugin_name = $plugin->get_name();
+ $this->plugins_list[$plugin_name] = $plugin;
+
+ //Register the plugin's functions
+ $hooks = $plugin->get_hooks();
+ foreach ($hooks as $hook => $functions) {
+ if (!in_array($hook, $this->available_hooks)) {
+ printf($lang['strhooknotfound']."\t\n", $hook);
+ exit;
+ }
+ $this->hooks[$hook][$plugin_name] = $functions;
+ }
+
+ //Register the plugin's actions
+ $actions = $plugin->get_actions();
+ $this->actions[$plugin_name] = $actions;
+ }
+
+ /**
+ * Execute the plugins hook functions when needed.
+ * @param $hook - The place where the function will be called
+ * @param $function_args - An array reference with arguments to give to called function
+ */
+ function do_hook($hook, &$function_args) {
+ if (isset($this->hooks[$hook])) {
+ foreach ($this->hooks[$hook] as $plugin_name => $functions) {
+ $plugin = $this->plugins_list[$plugin_name];
+ foreach ($functions as $function) {
+ if (method_exists($plugin, $function)) {
+ call_user_func(array($plugin, $function), $function_args);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Execute a plugin's action
+ * @param $plugin_name - The plugin name.
+ * @param $action - action that will be executed.
+ */
+ function do_action($plugin_name, $action) {
+ global $lang;
+
+ if (!isset($this->plugins_list[$plugin_name])) {
+ // Show an error and stop the application
+ printf($lang['strpluginnotfound']."\t\n", $name);
+ exit;
+ }
+ $plugin = $this->plugins_list[$plugin_name];
+
+ // Check if the plugin's method exists and if this method is an declared action.
+ if (method_exists($plugin, $action) and in_array($action, $this->actions[$plugin_name])) {
+ call_user_func(array($plugin, $action));
+ }
+ else {
+ // Show an error and stop the application
+ printf($lang['stractionnotfound']."\t\n", $action, $plugin_name);
+ exit;
+ }
+ }
+}
+?>
View
@@ -154,7 +154,17 @@
// Configuration for ajax scripts
// Time in seconds. If set to 0, refreshing data using ajax will be disabled (locks and activity pages)
$conf['ajax_refresh'] = 3;
-
+
+ /** Plugins management
+ * Add plugin names to the following array to activate them
+ * Example:
+ * $conf['plugins'] = array(
+ * 'Example',
+ * 'Slony'
+ * );
+ */
+ $conf['plugins'] = array();
+
/*****************************************
* Don't modify anything below this line *
*****************************************/
View
@@ -909,4 +909,9 @@
$lang['strftstabdicts'] = 'Dictionaries';
$lang['strftstabparsers'] = 'Parsers';
$lang['strftscantparsercopy'] = 'Can\'t specify both parser and template during text search configuration creation.';
+
+ //Plugins
+ $lang['strpluginnotfound'] = 'Error: plugin \'%s\' not found. Check if this plugin exists in the plugins/ directory, or if this plugins has a plugin.php file. Plugin\'s names are case sensitive';
+ $lang['stractionnotfound'] = 'Error: action \'%s\' not found in the \'%s\' plugin, or it was not specified as an action.';
+ $lang['strhooknotfound'] = 'Error: hook \'%s\' is not avaliable.';
?>
View
@@ -226,4 +226,8 @@ function htmlspecialchars_decode($string, $quote_style = ENT_COMPAT) {
return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
}
}
+
+ // Manage the plugins
+ require_once('./classes/PluginManager.php');
+ $plugin_manager = new PluginManager($_language);
?>
View
@@ -0,0 +1,5 @@
+<?php
+require_once('./libraries/lib.inc.php');
+
+$plugin_manager->do_action($_REQUEST['plugin'], $_REQUEST['action']);
+?>

0 comments on commit 3e282e6

Please sign in to comment.