new type of hooks via methodes instead of separate files:

- allows to parse arguments ot the hook and return content
- all access to the hook-table is now handled by the hook-class (for admin and setup too)
- all existing hooks continue to work of cause
This commit is contained in:
Ralf Becker 2003-04-27 22:26:04 +00:00
parent 6b78fbbcfb
commit 4e1cd7d1f5
5 changed files with 158 additions and 210 deletions

View File

@ -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;
}
}

View File

@ -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','<a href="' . $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiapplications.delete&app_name=' . urlencode($app_name) . "&confirm=True") . '">' . lang('Yes') . '</a>');
$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');
}
}
?>

View File

@ -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'))

View File

@ -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 '<pre>';
//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 "<p>hooks::process("; print_r($args); echo ")</p>\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 "<p>hooks::single("; print_r($args); echo ",'$appname')</p>\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 "<p>ADDING hooks for: $appname</p>";
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']);
}
}
}
}
?>

View File

@ -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);
}
/*