Open Journal Systems  3.3.0
HookRegistry.inc.php
1 <?php
2 
16 define('HOOK_SEQUENCE_CORE', 0x000);
17 define('HOOK_SEQUENCE_NORMAL', 0x100);
18 define('HOOK_SEQUENCE_LATE', 0x200);
19 define('HOOK_SEQUENCE_LAST', 0x300);
20 
21 class HookRegistry {
28  static function &getHooks($hookName = null) {
29  $hooks =& Registry::get('hooks', true, array());
30 
31  if ($hookName) {
32  if (isset($hooks[$hookName])) {
33  $hook =& $hooks[$hookName];
34  } else {
35  $hook = null;
36  }
37  return $hook;
38  }
39 
40  return $hooks;
41  }
42 
49  static function setHooks($hookName, $callbacks) {
50  $hooks =& HookRegistry::getHooks();
51  $hooks[$hookName] =& $callbacks;
52  }
53 
58  static function clear($hookName) {
59  $hooks =& HookRegistry::getHooks();
60  unset($hooks[$hookName]);
61  return $hooks;
62  }
63 
70  static function register($hookName, $callback, $hookSequence = HOOK_SEQUENCE_NORMAL) {
71  $hooks =& HookRegistry::getHooks();
72  $hooks[$hookName][$hookSequence][] =& $callback;
73  }
74 
86  static function call($hookName, $args = null) {
87  // Called only by Unit Test
88  // The implementation is a bit quirky as this has to work when
89  // executed statically.
90  if (self::rememberCalledHooks(true)) {
91  // Remember the called hooks for testing.
92  $calledHooks =& HookRegistry::getCalledHooks();
93  $calledHooks[] = array(
94  $hookName, $args
95  );
96  }
97 
98  $hooks =& HookRegistry::getHooks();
99  if (!isset($hooks[$hookName])) {
100  return false;
101  }
102 
103  if (isset($hooks[$hookName])) {
104  ksort($hooks[$hookName], SORT_NUMERIC);
105  foreach ($hooks[$hookName] as $priority => $hookList) {
106  foreach ($hookList as $hook) {
107  if ($result = call_user_func($hook, $hookName, $args)) return true;
108  }
109  }
110  }
111 
112  return false;
113  }
114 
115 
116  //
117  // Methods required for testing only.
118  //
128  static function rememberCalledHooks($askOnly = false, $updateTo = true) {
129  static $rememberCalledHooks = false;
130  if (!$askOnly) {
131  $rememberCalledHooks = $updateTo;
132  }
133  return $rememberCalledHooks;
134  }
135 
143  static function resetCalledHooks($leaveAlive = false) {
144  if (!$leaveAlive) HookRegistry::rememberCalledHooks(false, false);
145  $calledHooks =& HookRegistry::getCalledHooks();
146  $calledHooks = array();
147  }
148 
153  static function &getCalledHooks() {
154  static $calledHooks = array();
155  return $calledHooks;
156  }
157 }
158 
159 
HookRegistry\resetCalledHooks
static resetCalledHooks($leaveAlive=false)
Definition: HookRegistry.inc.php:143
HookRegistry\rememberCalledHooks
static rememberCalledHooks($askOnly=false, $updateTo=true)
Definition: HookRegistry.inc.php:128
HookRegistry\clear
static clear($hookName)
Definition: HookRegistry.inc.php:58
HookRegistry\setHooks
static setHooks($hookName, $callbacks)
Definition: HookRegistry.inc.php:49
HookRegistry\getCalledHooks
static & getCalledHooks()
Definition: HookRegistry.inc.php:153
HookRegistry
Class for linking core functionality with plugins.
Definition: HookRegistry.inc.php:21
Registry\get
static & get($key, $createIfEmpty=false, $createWithDefault=null)
Definition: Registry.inc.php:35
HookRegistry\getHooks
static & getHooks($hookName=null)
Definition: HookRegistry.inc.php:28
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86