]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Hook.php
Merge pull request #6430 from tobiasd/20190112-lng
[friendica.git] / src / Core / Hook.php
index 85ed98e886b2d39ab6724dae72c658dc74d837f4..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
@@ -120,6 +136,22 @@ class Hook extends BaseObject
        {
                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);
                        }
                }