$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'event', 'event'=>$event, 'data'=>$data) ); } if ( !isset($pwg_event_handlers[$event]) ) { return $data; } $args = array_slice(func_get_args(), 2); foreach ($pwg_event_handlers[$event] as $priority => $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('trigger', array('type'=>'post_event', 'event'=>$event, 'data'=>$data) ); return $data; } function trigger_action($event, $data=null) { global $pwg_event_handlers; if ( isset($pwg_event_handlers['trigger']) and $event!='trigger' ) {// special case for debugging - avoid recursive calls trigger_action('trigger', array('type'=>'action', '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) { 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; $clauses = array(); if (!empty($state)) { $clauses[] = 'state=\''.$state.'\''; } if (!empty($id)) { $clauses[] = 'id="'.$id.'"'; } if (count($clauses)) { $query .= ' WHERE '. implode(' AND ', $clauses); } $result = pwg_query($query); $plugins = array(); while ($row = pwg_db_fetch_assoc($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'); } } ?>