- * @brief unregisters a hook.
- *
- * @param string $hook the name of the hook
- * @param string $file the name of the file that hooks into
- * @param string $function the name of the function that the hook called
- * @return array
- */
- public static function unregisterHook($hook, $file, $function)
- {
- $relative_file = str_replace(self::getApp()->get_basepath() . DIRECTORY_SEPARATOR, '', $file);
-
- // This here is only needed for fixing a problem that existed on the develop branch
- $condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
- DBA::delete('hook', $condition);
-
- $condition = ['hook' => $hook, 'file' => $relative_file, 'function' => $function];
- $r = DBA::delete('hook', $condition);
- return $r;
- }
-
- /**
- * Load hooks
- */
- public static function loadHooks()
- {
- $a = self::getApp();
- $a->hooks = [];
- $r = DBA::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]);
-
- while ($rr = DBA::fetch($r)) {
- if (! array_key_exists($rr['hook'], $a->hooks)) {
- $a->hooks[$rr['hook']] = [];
- }
- $a->hooks[$rr['hook']][] = [$rr['file'],$rr['function']];
- }
- DBA::close($r);
- }
-
- /**
- * @brief Forks a hook.
- *
- * 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
- */
- public static function forkHooks($priority, $name, $data = null)
- {
- $a = self::getApp();
-
- if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
- foreach ($a->hooks[$name] as $hook) {
- Worker::add($priority, 'ForkHook', $name, $hook, $data);
- }
- }
- }
-
- /**
- * @brief Calls a hook.
- *
- * Use this function when you want to be able to allow a hook to manipulate
- * the provided data.
- *
- * @param string $name of the hook to call
- * @param string|array &$data to transmit to the callback handler
- */
- public static function callHooks($name, &$data = null)
- {
- $a = self::getApp();
-
- if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
- foreach ($a->hooks[$name] as $hook) {
- self::callSingleHook($a, $name, $hook, $data);
- }
- }
- }
-
- /**
- * @brief Calls a single hook.
- *
- * @param App $a
- * @param string $name of the hook to call
- * @param array $hook Hook data
- * @param string|array &$data to transmit to the callback handler
- */
- public static function callSingleHook(App $a, $name, $hook, &$data = null)
- {
- // Don't run a theme's hook if the user isn't using the theme
- if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/' . $a->getCurrentTheme()) === false) {
- return;
- }
-
- @include_once($hook[0]);
- if (function_exists($hook[1])) {
- $func = $hook[1];
- $func($a, $data);
- } else {
- // remove orphan hooks
- $condition = ['hook' => $name, 'file' => $hook[0], 'function' => $hook[1]];
- DBA::delete('hook', $condition, ['cascade' => false]);
- }
- }
-
- /**
- * check if an app_menu hook exist for addon $name.
- * Return true if the addon is an app
- */
- public static function isApp($name)
- {
- $a = self::getApp();
-
- if (is_array($a->hooks) && (array_key_exists('app_menu', $a->hooks))) {
- foreach ($a->hooks['app_menu'] as $hook) {
- if ($hook[0] == 'addon/'.$name.'/'.$name.'.php') {
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * @brief Parse addon comment in search of addon infos.