X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FHook.php;h=2d6c945067965263e45f6a2b879602615e76facd;hb=33e096434af297743f2aed43aab8fd9f4e68c1e6;hp=839b55815a5d6f4dc3f4829da596ea06988fe5e7;hpb=015e2a84b11ad92607c8fb3506ff19c3b2839215;p=friendica.git diff --git a/src/Core/Hook.php b/src/Core/Hook.php index 839b55815a..2d6c945067 100644 --- a/src/Core/Hook.php +++ b/src/Core/Hook.php @@ -38,16 +38,32 @@ class Hook extends BaseObject $stmt = DBA::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]); while ($hook = DBA::fetch($stmt)) { - if (!array_key_exists($hook['hook'], self::$hooks)) { - self::$hooks[$hook['hook']] = []; - } - self::$hooks[$hook['hook']][] = [$hook['file'], $hook['function']]; + self::add($hook['hook'], $hook['file'], $hook['function']); } DBA::close($stmt); } /** - * Registers a hook. + * @brief Adds a new hook to the hooks array. + * + * This function is meant to be called by modules on each page load as it works after loadHooks has been called. + * + * @param type $hook + * @param type $file + * @param type $function + */ + public static function add($hook, $file, $function) + { + if (!array_key_exists($hook, self::$hooks)) { + self::$hooks[$hook] = []; + } + self::$hooks[$hook][] = [$file, $function]; + } + + /** + * @brief Registers a hook. + * + * This function is meant to be called once when an addon is enabled for example as it doesn't add to the current hooks. * * @param string $hook the name of the hook * @param string $file the name of the file that hooks into @@ -93,7 +109,7 @@ class Hook extends BaseObject /** * Returns the list of callbacks for a single hook * - * @param string $name + * @param string $name Name of the hook * @return array */ public static function getByName($name) @@ -112,13 +128,30 @@ class Hook extends BaseObject * * Use this function when you want to fork a hook via the worker. * - * @param string $name of the hook to call - * @param string|array $data to transmit to the callback handler + * @param integer $priority of the hook + * @param string $name of the hook to call + * @param mixed $data to transmit to the callback handler */ public static function fork($priority, $name, $data = null) { if (array_key_exists($name, self::$hooks)) { foreach (self::$hooks[$name] as $hook) { + // Call a hook to check if this hook call needs to be forked + if (array_key_exists('hook_fork', self::$hooks)) { + $hookdata = ['name' => $name, 'data' => $data, 'execute' => true]; + + foreach (self::$hooks['hook_fork'] as $fork_hook) { + if ($hook[0] != $fork_hook[0]) { + continue; + } + self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata); + } + + if (!$hookdata['execute']) { + continue; + } + } + Worker::add($priority, 'ForkHook', $name, $hook, $data); } } @@ -169,8 +202,11 @@ class Hook extends BaseObject } /** - * check if an app_menu hook exist for addon $name. + * Checks if an app_menu hook exist for the provided addon name. * Return true if the addon is an app + * + * @param string $name Name of the addon + * @return boolean */ public static function isAddonApp($name) {