]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Hook.php
Merge pull request #6400 from annando/issue-6394
[friendica.git] / src / Core / Hook.php
index 839b55815a5d6f4dc3f4829da596ea06988fe5e7..2d6c945067965263e45f6a2b879602615e76facd 100644 (file)
@@ -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)
        {