/** * Run user defined hooks * * @param string $event * @param object $errorHandler * @param array $args * @return boolean (true to continue processing, false otherwise) */ public static function run($event, $args = array()) { $config = $GLOBALS['config']; if (!isset($config['Hooks'])) { return true; } $hooks =& $config['Hooks']; if (!is_array($hooks) || !array_key_exists($event, $hooks) || !is_array($hooks[$event])) { return true; } $errorHandler = $GLOBALS['connector']->getErrorHandler(); foreach ($hooks[$event] as $i => $hook) { $object = NULL; $method = NULL; $function = NULL; $data = NULL; $passData = false; /* $hook can be: a function, an object, an array of $functiontion and $data, * an array of just a function, an array of object and method, or an * array of object, method, and data. */ //function if (is_string($hook)) { $function = $hook; } else { if (is_object($hook)) { $object = $hooks[$event][$i]; $method = "on" . $event; } else { if (is_array($hook)) { $count = count($hook); if ($count) { //...object if (is_object($hook[0])) { $object = $hooks[$event][$i][0]; if ($count < 2) { $method = "on" . $event; } else { //...object and method $method = $hook[1]; if (count($hook) > 2) { //...object, method and data $passData = true; $data = $hook[2]; } } } else { if (is_string($hook[0])) { $function = $hook[0]; if ($count > 1) { //...function with data $passData = true; $data = $hook[1]; } } } } } } } /* If defined, add data to the arguments array */ if ($passData) { $args = array_merge(array($data), $args); } if (isset($object)) { $callback = array($object, $method); } else { if (false !== ($pos = strpos($function, '::'))) { $callback = array(substr($function, 0, $pos), substr($function, $pos + 2)); } else { $callback = $function; } } if (is_callable($callback)) { $ret = call_user_func_array($callback, $args); } else { $functionName = QFinder_Connector_Core_Hooks::_printCallback($callback); $errorHandler->throwError(QFINDER_CONNECTOR_ERROR_CUSTOM_ERROR, "QFinder failed to call a hook: " . $functionName); return false; } //String return is a custom error if (is_string($ret)) { $errorHandler->throwError(QFINDER_CONNECTOR_ERROR_CUSTOM_ERROR, $ret); return false; } else { if (is_int($ret)) { $errorHandler->throwError($ret); return false; } else { if ($ret === null) { $functionName = QFinder_Connector_Core_Hooks::_printCallback($callback); $errorHandler->throwError(QFINDER_CONNECTOR_ERROR_CUSTOM_ERROR, "QFinder extension returned an invalid value (null)." . "Hook " . $functionName . " should return a value."); return false; } else { if (!$ret) { return false; } } } } } return true; }