$file) { include_once $plugins_dir.$file; if($this->debug) $app->log('Loading plugin: '.$plugin_name, LOGLEVEL_DEBUG); $app->loaded_plugins[$plugin_name] = new $plugin_name; $app->loaded_plugins[$plugin_name]->onLoad(); } } else { $app->log('Unable to open the plugins directory: '.$plugins_dir, LOGLEVEL_ERROR); } } else { $app->log('Plugins directory missing: '.$plugins_dir, LOGLEVEL_ERROR); } } /* This function is used by the modules to announce which events they provide */ function announceEvents($module_name, $events) { global $app; foreach($events as $event_name) { $this->available_events[$event_name] = $module_name; if($this->debug) $app->log('Announced event: '.$event_name, LOGLEVEL_DEBUG); } } /* This function is called by the plugin to register for an event */ function registerEvent($event_name, $plugin_name, $function_name) { global $app; if(!isset($this->available_events[$event_name])) { $app->log("Unable to register function '$function_name' from plugin '$plugin_name' for event '$event_name'", LOGLEVEL_DEBUG); } else { $this->subscribed_events[$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name); if($this->debug) $app->log("Registered function '$function_name' from plugin '$plugin_name' for event '$event_name'.", LOGLEVEL_DEBUG); } } function raiseEvent($event_name, $data) { global $app; // Get the subscriptions for this event $events = (isset($this->subscribed_events[$event_name]))?$this->subscribed_events[$event_name]:''; if($this->debug) $app->log('Raised event: '.$event_name, LOGLEVEL_DEBUG); if(is_array($events)) { foreach($events as $event) { $plugin_name = $event['plugin']; $function_name = $event['function']; // Call the processing function of the plugin $app->log("Calling function '$function_name' from plugin '$plugin_name' raised by event '$event_name'.", LOGLEVEL_DEBUG); // call_user_method($function_name,$app->loaded_plugins[$plugin_name],$event_name,$data); call_user_func(array($app->loaded_plugins[$plugin_name], $function_name), $event_name, $data); unset($plugin_name); unset($function_name); } } unset($event); unset($events); } /* This function is called by the plugin to register for an action */ function registerAction($action_name, $plugin_name, $function_name) { global $app; $this->subscribed_actions[$action_name][] = array('plugin' => $plugin_name, 'function' => $function_name); if($this->debug) $app->log("Registered function '$function_name' from plugin '$plugin_name' for action '$action_name'.", LOGLEVEL_DEBUG); } function raiseAction($action_name, $data, $return_data = false) { global $app; //* Get the subscriptions for this action $actions = (isset($this->subscribed_actions[$action_name]))?$this->subscribed_actions[$action_name]:''; if($this->debug) $app->log('Raised action: '.$action_name, LOGLEVEL_DEBUG); $result = ''; if(is_array($actions)) { foreach($actions as $action) { $plugin_name = $action['plugin']; $function_name = $action['function']; $state_out = 'ok'; //* Call the processing function of the plugin $app->log("Calling function '$function_name' from plugin '$plugin_name' raised by action '$action_name'.", LOGLEVEL_DEBUG); $state = call_user_func(array($app->loaded_plugins[$plugin_name], $function_name), $action_name, $data); //* ensure that we return the highest warning / error level if a error occured in one of the functions if($return_data) { if($state) { if(is_array($state) && (!$result || is_array($result))) { $result = array_merge($result, $state); } elseif(!is_array($state)) { $result .= $state; } } } else { if($state == 'warning' && $state_out != 'error') $state_out = 'warning'; elseif($state == 'error') $state_out = 'error'; } unset($plugin_name); unset($function_name); } } unset($action); unset($actions); if($return_data == true) return $result; else return $state_out; } } ?>