diff --git a/admin/inc/class.boapplications.inc.php b/admin/inc/class.boapplications.inc.php index d2b1af8564..8b46b13954 100644 --- a/admin/inc/class.boapplications.inc.php +++ b/admin/inc/class.boapplications.inc.php @@ -13,10 +13,6 @@ class boapplications { - var $public_functions = array( - 'register_all_hooks' => True - ); - var $so; function boapplications() @@ -58,39 +54,4 @@ { return $this->so->delete($app_name); } - - function register_hook($hook_app) - { - return $this->so->register_hook($hook_app); - } - - function register_all_hooks() - { - $SEP = filesystem_separator(); - $app_list = $this->get_list(); - $hooks = CreateObject('phpgwapi.hooks'); - while(list($app_name,$app) = each($app_list)) - { - $f = PHPGW_SERVER_ROOT . $SEP . $app_name . $SEP . 'setup' . $SEP . 'setup.inc.php'; - if(@file_exists($f)) - { - include($f); - while(is_array($setup_info[$app_name]['hooks']) && list(,$hook) = @each($setup_info[$app_name]['hooks'])) - { - if(!@$hooks->found_hooks[$app_name][$hook]) - { - $this->register_hook( - Array( - 'app_name' => $app_name, - 'hook' => $hook - ) - ); - } - } - } - } - Header('Location: '.$GLOBALS['phpgw']->link('/admin/index.php')); - $GLOBALS['phpgw_info']['flags']['nodisplay'] = True; - exit; - } } diff --git a/admin/inc/class.uiapplications.inc.php b/admin/inc/class.uiapplications.inc.php index 86637cc228..b7eecaec35 100644 --- a/admin/inc/class.uiapplications.inc.php +++ b/admin/inc/class.uiapplications.inc.php @@ -17,7 +17,8 @@ 'get_list' => True, 'add' => True, 'edit' => True, - 'delete' => True + 'delete' => True, + 'register_all_hooks' => True ); var $bo; @@ -338,5 +339,16 @@ $GLOBALS['phpgw']->template->set_var('yes','' . lang('Yes') . ''); $GLOBALS['phpgw']->template->pparse('out','body'); } + + function register_all_hooks() + { + if (!is_object($GLOBALS['phpgw']->hooks)) + { + $GLOBALS['phpgw']->hooks = CreateObject('phpgwapi.hooks'); + } + $GLOBALS['phpgw']->hooks->register_all_hooks(); + + $GLOBALS['phpgw']->redirect_link('/admin/index.php'); + } } ?> diff --git a/admin/inc/hook_admin.inc.php b/admin/inc/hook_admin.inc.php index 84aa068c2a..05877f2820 100644 --- a/admin/inc/hook_admin.inc.php +++ b/admin/inc/hook_admin.inc.php @@ -62,7 +62,7 @@ if (! $GLOBALS['phpgw']->acl->check('appreg_access',1,'admin')) { - $file['Find and Register all Application Hooks'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.boapplications.register_all_hooks'); + $file['Find and Register all Application Hooks'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.register_all_hooks'); } if (! $GLOBALS['phpgw']->acl->check('info_access',1,'admin')) diff --git a/phpgwapi/inc/class.hooks.inc.php b/phpgwapi/inc/class.hooks.inc.php index f1ac5cd826..385a3d2429 100644 --- a/phpgwapi/inc/class.hooks.inc.php +++ b/phpgwapi/inc/class.hooks.inc.php @@ -34,13 +34,16 @@ class hooks { var $found_hooks = Array(); - function hooks() + var $db = ''; + + function hooks($db='') { - //$GLOBALS['phpgw']->db->query("SELECT hook_appname, hook_location, hook_filename FROM phpgw_hooks WHERE hook_location='".$location."'",__LINE__,__FILE__); - $GLOBALS['phpgw']->db->query("SELECT hook_appname, hook_location, hook_filename FROM phpgw_hooks",__LINE__,__FILE__); - while( $GLOBALS['phpgw']->db->next_record() ) + $this->db = $db ? $db : $GLOBALS['phpgw']->db; // this is to allow setup to set the db + + $this->db->query("SELECT hook_appname, hook_location, hook_filename FROM phpgw_hooks",__LINE__,__FILE__); + while( $this->db->next_record() ) { - $this->found_hooks[$GLOBALS['phpgw']->db->f('hook_appname')][$GLOBALS['phpgw']->db->f('hook_location')] = $GLOBALS['phpgw']->db->f('hook_filename'); + $this->found_hooks[$this->db->f('hook_appname')][$this->db->f('hook_location')] = $this->db->f('hook_filename'); } //echo '
';
 			//print_r($this->found_hooks);
@@ -49,103 +52,103 @@
 
 		/*!
 		@function process
-		@abstract loads up all the hooks the user has rights to
-		@discussion Someone flesh this out please
+		@abstract executes all the hooks (the user has rights to) for a given location 
+		@syntax process($args,$order='',$no_permission_check = False)
+		@param $args location-name as string or array:
+		@param $args['location'] location-name
+		@param $order or $args['order'] array of appnames (as value), which should be executes first
+		@param $args is passed to the hook, if its a new method-hook
+		@param $no_permission_check if True execute all hooks, not only the ones a user has rights to
+		@note $no_permission_check should *ONLY* be used when it *HAS* to be. (jengo)
+		@returns array with results of each hook call (with appname as key): \
+			False if no hook exists, True if old hook exists \
+			and whatever the new methode-hook returns (can be True or False too!).
 		*/
-		// Note: $no_permission_check should *ONLY* be used when it *HAS* to be. (jengo)
-		function process($location, $order = '', $no_permission_check = False)
+		function process($args, $order = '', $no_permission_check = False)
 		{
+			//echo "

hooks::process("; print_r($args); echo ")

\n"; if ($order == '') { - settype($order,'array'); - $order[] = $GLOBALS['phpgw_info']['flags']['currentapp']; + $order = is_array($args) && isset($args['order']) ? $args['order'] : + array($GLOBALS['phpgw_info']['flags']['currentapp']); } /* First include the ordered apps hook file */ - reset ($order); - while (list(,$appname) = each($order)) + foreach($order as $appname) { - if (isset($this->found_hooks[$appname][$location])) - { - $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'inc' . SEP . $this->found_hooks[$appname][$location]; - if (file_exists($f) && - ( $GLOBALS['phpgw_info']['user']['apps'][$appname] || (($no_permission_check || $appname == 'preferences') && $appname)) ) - { - include($f); - } - } - $completed_hooks[$appname] = True; + $results[$appname] = $this->single($args,$appname,$no_permission_check); } /* Then add the rest */ - if ($no_permission_check) { - reset($GLOBALS['phpgw_info']['apps']); - while (list(,$p) = each($GLOBALS['phpgw_info']['apps'])) - { - $appname = $p['name']; - if (! isset($completed_hooks[$appname]) || $completed_hooks[$appname] != True) - { - if (isset($this->found_hooks[$appname][$location])) - { - $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'inc' . SEP . $this->found_hooks[$appname][$location]; - if (file_exists($f)) - { - include($f); - } - } - } - } + $apps = $GLOBALS['phpgw_info']['apps']; } else { - reset ($GLOBALS['phpgw_info']['user']['apps']); - while (list(,$p) = each($GLOBALS['phpgw_info']['user']['apps'])) + $apps = $GLOBALS['phpgw_info']['user']['apps']; + } + foreach($apps as $app) + { + $appname = $app['name']; + if (!isset($results[$appname])) { - $appname = $p['name']; - if (! isset($completed_hooks[$appname]) || $completed_hooks[$appname] != True) - { - if (isset($this->found_hooks[$appname][$location])) - { - $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'inc' . SEP . $this->found_hooks[$appname][$location]; - if (file_exists($f)) - { - include($f); - } - } - } + $results[$appname] = $this->single($args,$appname,$no_permission_check); } } + return $results; } /*! @function single - @abstract call the hooks for a single application - @param $location hook location - required - @param $appname application name - optional + @abstract executes a single hook of a given location and application + @syntax single($args,$appname='',$no_permission_check = False) + @param $args location-name as string or array: + @param $args['location'] location-name + @param $appname or $args['appname'] name of the app, which's hook to execute, if empty the current app is used + @param $args is passed to the hook, if its a new method-hook + @param $no_permission_check if True execute all hooks, not only the ones a user has rights to + @note $no_permission_check should *ONLY* be used when it *HAS* to be. (jengo) + @returns False if no hook exists, True if an old hook exist and whatever the new method-hook returns */ - // Note: $no_permission_check should *ONLY* be used when it *HAS* to be. (jengo) - function single($location, $appname = '', $no_permission_check = False) + function single($args, $appname = '', $no_permission_check = False) { - if (! $appname) + //echo "

hooks::single("; print_r($args); echo ",'$appname')

\n"; + if (is_array($args)) { - $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; + $location = $args['location']; + } + else + { + $location = $args; + } + if (!$appname) + { + $appname = is_array($args) && isset($args['appname']) ? $args['appname'] : $GLOBALS['phpgw_info']['flags']['currentapp']; } /* First include the ordered apps hook file */ if (isset($this->found_hooks[$appname][$location])) { - $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'inc' . SEP . $this->found_hooks[$appname][$location]; - if (file_exists($f) && - ( $GLOBALS['phpgw_info']['user']['apps'][$appname] || (($no_permission_check || $location == 'config' || $appname == 'phpgwapi') && $appname)) ) + $parts = explode('.',$method = $this->found_hooks[$appname][$location]); + + if (count($parts) != 3 || ($parts[1] == 'inc' && $parts[2] == 'php')) { - include($f); - return True; + $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'inc' . SEP . $method; + if (file_exists($f) && + ( $GLOBALS['phpgw_info']['user']['apps'][$appname] || (($no_permission_check || $location == 'config' || $appname == 'phpgwapi') && $appname)) ) + { + include($f); + return True; + } + else + { + return False; + } } - else + else // new style method-hook { - return False; + return ExecMethod($method,$args); } } else @@ -154,40 +157,6 @@ } } - /*! - @function single_tpl - @abstract call the hooks for a single application, return output from the hook - @discussion This is a BROKEN function on php3... wcm is not using it anymore - @param $location hook location - required - @param $appname application name - optional - */ - function single_tpl($location, $appname='', $no_permission_check=False) - { - if(!$appname) - { - $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; - } - - if(@isset($this->found_hooks[$appname][$location])) - { - $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'inc' . SEP . $this->found_hooks[$appname][$location]; - if(@file_exists($f) && - ( $GLOBALS['phpgw_info']['user']['apps'][$appname] || (($no_permission_check || $location == 'config' || $appname == 'phpgwapi') && $appname)) ) - { - eval('$retval = include(\$f);'); - return $retval; - } - else - { - return ''; - } - } - else - { - return ''; - } - } - /*! @function count @abstract loop through the applications and count the hooks @@ -195,17 +164,16 @@ function count($location) { $count = 0; - reset($GLOBALS['phpgw_info']['user']['apps']); - while ($permission = each($GLOBALS['phpgw_info']['user']['apps'])) + foreach($GLOBALS['phpgw_info']['user']['apps'] as $appname => $data) { - if (isset($this->found_hooks[$permission[0]][$location])) + if (isset($this->found_hooks[$appname][$location])) { ++$count; } } return $count; } - + /*! @function read() @abstract currently not being used @@ -218,5 +186,62 @@ //} return $this->found_hooks; } + + /*! + @function register_hooks + @abstract Register and/or de-register an application's hooks + @syntax register_hooks($appname,$hooks='') + @param $appname Application 'name' + @param $hooks array with hooks to register, eg $setup_info[$app]['hooks'] or not used for only deregister the hooks + */ + function register_hooks($appname,$hooks='') + { + if(!$appname) + { + return False; + } + $db_appname = $this->db->db_addslashes($appname); + $this->db->query("DELETE FROM phpgw_hooks WHERE hook_appname='$db_appname'",__LINE__,__FILE__); + + if (!is_array($hooks)) // only deregister + { + return True; + } + //echo "

ADDING hooks for: $appname

"; + foreach($hooks as $key => $hook) + { + if (!is_numeric($key)) // new methode-hook + { + $location = $key; + $filename = $hook; + } + else + { + $location = $hook; + $filename = "hook_$hook.inc.php"; + } + $this->db->query("INSERT INTO phpgw_hooks (hook_appname,hook_location,hook_filename)". + " VALUES ('$appname','$location','$filename');"); + } + return True; + } + + + /*! + @function register_all_hooks + @abstract Register the hooks of all applications (used by admin) + */ + function register_all_hooks() + { + foreach($GLOBALS['phpgw_info']['apps'] as $appname => $app) + { + $f = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'setup' . SEP . 'setup.inc.php'; + if(@file_exists($f)) + { + include($f); + $this->register_hooks($appname,$setup_info[$appname]['hooks']); + } + } + } } ?> diff --git a/phpgwapi/inc/class.setup.inc.php b/phpgwapi/inc/class.setup.inc.php index c635a4934e..034a1d3bb9 100644 --- a/phpgwapi/inc/class.setup.inc.php +++ b/phpgwapi/inc/class.setup.inc.php @@ -559,27 +559,11 @@ return False; } - $this->db->query("SELECT COUNT(hook_appname) FROM phpgw_hooks WHERE hook_appname='".$appname."'"); - $this->db->next_record(); - if($this->db->f(0)) + if (!is_object($this->hooks)) { - $this->deregister_hooks($appname); - } - - //echo "ADDING hooks for: " . $setup_info[$appname]['name']; - if(is_array($setup_info[$appname]['hooks'])) - { - while(list($key,$hook) = each($setup_info[$appname]['hooks'])) - { - $this->db->query("INSERT INTO phpgw_hooks " - . "(hook_appname,hook_location,hook_filename) " - . "VALUES (" - . "'" . $setup_info[$appname]['name'] . "'," - . "'" . $hook . "'," - . "'" . "hook_" . $hook . ".inc.php" . "');" - ); - } + $this->hooks = CreateObject('phpgwapi.hooks',$this->db); } + $this->hooks->register_hooks($appname,$setup_info[$appname]['hooks']); } /*! @@ -589,34 +573,7 @@ */ function update_hooks($appname) { - $setup_info = $GLOBALS['setup_info']; - - if(!$appname) - { - return False; - } - - if($this->alessthanb($setup_info['phpgwapi']['currentver'],'0.9.8pre5')) - { - /* No phpgw_hooks table yet. */ - return False; - } - - $this->db->query("SELECT COUNT(*) FROM phpgw_hooks WHERE hook_appname='".$appname."'"); - $this->db->next_record(); - if(!$this->db->f(0)) - { - return False; - } - - if($setup_info[$appname]['version']) - { - if(is_array($setup_info[$appname]['hooks'])) - { - $this->deregister_hooks($appname); - $this->register_hooks($appname); - } - } + $this->register_hooks($appname); } /*! @@ -636,9 +593,13 @@ { return False; } - + //echo "DELETING hooks for: " . $setup_info[$appname]['name']; - $this->db->query("DELETE FROM phpgw_hooks WHERE hook_appname='". $appname ."'"); + if (!is_object($this->hooks)) + { + $this->hooks = CreateObject('phpgwapi.hooks',$this->db); + } + $this->hooks->register_hooks($appname); } /*! @@ -649,22 +610,11 @@ */ function hook($location, $appname='') { - if(!$appname) + if (!is_object($this->hooks)) { - $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; - } - $SEP = filesystem_separator(); - - $f = PHPGW_SERVER_ROOT . $SEP . $appname . $SEP . 'inc' . $SEP . 'hook_' . $location . '.inc.php'; - if(file_exists($f)) - { - include($f); - return True; - } - else - { - return False; + $this->hooks = CreateObject('phpgwapi.hooks',$this->db); } + return $this->hooks->single($locaton,$appname); } /*