aboutsummaryrefslogtreecommitdiffstats
path: root/BSF/include/functions_plugins.inc.php
diff options
context:
space:
mode:
authorvdigital <vdigital@piwigo.org>2008-05-23 21:05:41 +0000
committervdigital <vdigital@piwigo.org>2008-05-23 21:05:41 +0000
commit77fd1f51a3c5f5a52f72ef8a299fe368228e2285 (patch)
treea67ede42904657ccf3349ecdaef1cec8b8e36ff8 /BSF/include/functions_plugins.inc.php
parent553727dffacc48e8337c1d141f2a25af359e74b1 (diff)
git-svn-id: http://piwigo.org/svn/trunk@2357 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to '')
-rw-r--r--BSF/include/functions_plugins.inc.php284
1 files changed, 284 insertions, 0 deletions
diff --git a/BSF/include/functions_plugins.inc.php b/BSF/include/functions_plugins.inc.php
new file mode 100644
index 000000000..e2beb18ac
--- /dev/null
+++ b/BSF/include/functions_plugins.inc.php
@@ -0,0 +1,284 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify |
+// | it under the terms of the GNU General Public License as published by |
+// | the Free Software Foundation |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/*
+Events and event handlers are the core of Piwigo plugin management.
+Plugins are addons that are found in plugins subdirectory. If activated, PWG
+will include the index.php of each plugin.
+Events are triggered by PWG core code. Plugins (or even PWG itself) can
+register their functions to handle these events. An event is identified by a
+string.
+*/
+
+define('PHPWG_PLUGINS_PATH', PHPWG_ROOT_PATH.'plugins/');
+
+define('EVENT_HANDLER_PRIORITY_NEUTRAL', 50);
+
+/* 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
+ * @param int $priority optional priority (greater priority will
+ * be executed at last)
+*/
+function add_event_handler($event, $func,
+ $priority=EVENT_HANDLER_PRIORITY_NEUTRAL, $accepted_args=1)
+{
+ global $pwg_event_handlers;
+
+ if ( isset($pwg_event_handlers[$event][$priority]) )
+ {
+ foreach($pwg_event_handlers[$event][$priority] as $handler)
+ {
+ if ( $handler['function'] == $func )
+ {
+ return false;
+ }
+ }
+ }
+
+ $pwg_event_handlers[$event][$priority][] =
+ array(
+ 'function'=>$func,
+ 'accepted_args'=>$accepted_args);
+ ksort( $pwg_event_handlers[$event] );
+ return true;
+}
+
+/* Register a event handler.
+ * @param string $event the name of the event to listen to
+ * @param mixed $func the function that needs removal
+ * @param int $priority optional priority (greater priority will
+ * be executed at last)
+*/
+function remove_event_handler($event, $func,
+ $priority=EVENT_HANDLER_PRIORITY_NEUTRAL)
+{
+ global $pwg_event_handlers;
+
+ if (!isset( $pwg_event_handlers[$event][$priority] ) )
+ {
+ return false;
+ }
+ for ($i=0; $i<count($pwg_event_handlers[$event][$priority]); $i++)
+ {
+ if ($pwg_event_handlers[$event][$priority][$i]['function']==$func)
+ {
+ unset($pwg_event_handlers[$event][$priority][$i]);
+ $pwg_event_handlers[$event][$priority] =
+ array_values($pwg_event_handlers[$event][$priority]);
+
+ if ( empty($pwg_event_handlers[$event][$priority]) )
+ {
+ unset( $pwg_event_handlers[$event][$priority] );
+ if (empty( $pwg_event_handlers[$event] ) )
+ {
+ unset( $pwg_event_handlers[$event] );
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+/* Triggers an event and calls all registered event handlers
+ * @param string $event name of the event
+ * @param mixed $data data to pass to handlers
+*/
+function trigger_event($event, $data=null)
+{
+ global $pwg_event_handlers;
+
+ // just for debugging
+ trigger_action('pre_trigger_event',
+ array('event'=>$event, 'data'=>$data) );
+
+ if ( !isset($pwg_event_handlers[$event]) )
+ {
+ trigger_action('post_trigger_event',
+ array('event'=>$event, 'data'=>$data) );
+ return $data;
+ }
+ $args = array_slice(func_get_args(), 2);
+
+ foreach ($pwg_event_handlers[$event] as $priority => $handlers)
+ {
+ if ( !is_null($handlers) )
+ {
+ foreach($handlers as $handler)
+ {
+ $all_args = array_merge( array($data), $args);
+ $function_name = $handler['function'];
+ $accepted_args = $handler['accepted_args'];
+
+ if ( $accepted_args == 1 )
+ $the_args = array($data);
+ elseif ( $accepted_args > 1 )
+ $the_args = array_slice($all_args, 0, $accepted_args);
+ elseif ( $accepted_args == 0 )
+ $the_args = NULL;
+ else
+ $the_args = $all_args;
+
+ $data = call_user_func_array($function_name, $the_args);
+ }
+ }
+ }
+ trigger_action('post_trigger_event',
+ array('event'=>$event, 'data'=>$data) );
+ return $data;
+}
+
+function trigger_action($event, $data=null)
+{
+ global $pwg_event_handlers;
+ if ($event!='pre_trigger_event'
+ and $event!='post_trigger_event'
+ and $event!='trigger_action')
+ {// special case for debugging - avoid recursive calls
+ trigger_action('trigger_action',
+ array('event'=>$event, 'data'=>$data) );
+ }
+
+ if ( !isset($pwg_event_handlers[$event]) )
+ {
+ return;
+ }
+ $args = array_slice(func_get_args(), 2);
+
+ foreach ($pwg_event_handlers[$event] as $priority => $handlers)
+ {
+ if ( !is_null($handlers) )
+ {
+ foreach($handlers as $handler)
+ {
+ $all_args = array_merge( array($data), $args);
+ $function_name = $handler['function'];
+ $accepted_args = $handler['accepted_args'];
+
+ if ( $accepted_args == 1 )
+ $the_args = array($data);
+ elseif ( $accepted_args > 1 )
+ $the_args = array_slice($all_args, 0, $accepted_args);
+ elseif ( $accepted_args == 0 )
+ $the_args = NULL;
+ else
+ $the_args = $all_args;
+
+ call_user_func_array($function_name, $the_args);
+ }
+ }
+ }
+}
+
+/** Saves some data with the associated plugim id. It can be retrieved later (
+ * during this script lifetime) using get_plugin_data
+ * @param string plugin_id
+ * @param mixed data
+ * returns true on success, false otherwise
+ */
+function set_plugin_data($plugin_id, &$data)
+{
+ global $pwg_loaded_plugins;
+ if ( isset($pwg_loaded_plugins[$plugin_id]) )
+ {
+ $pwg_loaded_plugins[$plugin_id]['plugin_data'] = &$data;
+ return true;
+ }
+ return false;
+}
+
+/** Retrieves plugin data saved previously with set_plugin_data
+ * @param string plugin_id
+ */
+function &get_plugin_data($plugin_id)
+{
+ global $pwg_loaded_plugins;
+ if ( isset($pwg_loaded_plugins[$plugin_id]) )
+ {
+ return $pwg_loaded_plugins[$plugin_id]['plugin_data'];
+ }
+ return null;
+}
+
+/* Returns an array of plugins defined in the database
+ * @param string $state optional filter on this state
+ * @param string $id optional returns only data about given plugin
+*/
+function get_db_plugins($state='', $id='')
+{
+ $query = '
+SELECT * FROM '.PLUGINS_TABLE;
+ if (!empty($state) or !empty($id) )
+ {
+ $query .= '
+WHERE 1=1';
+ if (!empty($state))
+ {
+ $query .= '
+ AND state="'.$state.'"';
+ }
+ if (!empty($id))
+ {
+ $query .= '
+ AND id="'.$id.'"';
+ }
+ }
+
+ $result = pwg_query($query);
+ $plugins = array();
+ while ($row = mysql_fetch_array($result))
+ {
+ array_push($plugins, $row);
+ }
+ return $plugins;
+}
+
+
+function load_plugin($plugin)
+{
+ $file_name = PHPWG_PLUGINS_PATH.$plugin['id'].'/main.inc.php';
+ if ( file_exists($file_name) )
+ {
+ global $pwg_loaded_plugins;
+ $pwg_loaded_plugins[ $plugin['id'] ] = $plugin;
+ include_once( $file_name );
+ }
+}
+
+/*loads all the plugins on startup*/
+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_action('plugins_loaded');
+ }
+}
+?> \ No newline at end of file