예제 #1
0
파일: Hooks.php 프로젝트: wharin/quantum
 /**
  * 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;
 }