You are here

function js_execute_callback in JS Callback Handler 6

Same name and namespace in other branches
  1. 5.2 js.php \js_execute_callback()
  2. 7 js.php \js_execute_callback()

Loads the requested module and executes the requested callback.

Parameters

$phase: Determins which execution phase to run.

Return value

The callback function's return value or one of the JS_* constants.

1 call to js_execute_callback()
js.php in ./js.php
Callback page that serves custom JavaScript requests on a Drupal installation.

File

./js.php, line 42
Callback page that serves custom JavaScript requests on a Drupal installation.

Code

function js_execute_callback($phase = 1) {
  global $locale;

  // remember between phases
  static $full_bootstrap, $modules, $module, $info, $args, $dependencies;

  // first phase bootstraps, loads includes
  // and prepares the module list to determine whether
  // function filter_xss_bad_protocol needs to be redefined or not.
  switch ($phase) {
    case 1:
      $args = explode('/', $_GET['q']);

      // Strip first argument 'js'.
      array_shift($args);

      // Determine module to load.
      $module = check_plain(array_shift($args));
      if (!$module || !drupal_load('module', $module)) {
        return JS_ACCESS_DENIED;
      }

      // Get info hook function name.
      $function = $module . '_js';
      if (!function_exists($function)) {
        return JS_NOT_FOUND;
      }

      // Get valid callbacks.
      $valid_callbacks = $function();
      $callback_args = $args;

      // Remove callback name from function arguments.
      array_shift($args);
      $callback_valid = FALSE;
      while (!empty($callback_args)) {
        $callback = check_plain(implode('/', $callback_args));
        if (isset($valid_callbacks[$callback])) {
          $callback_valid = TRUE;
          break;
        }
        else {

          // pop another parameter off the incoming args and check again
          array_pop($callback_args);
        }
      }
      if (!$callback_valid) {
        return JS_NOT_FOUND;
      }
      $info = $valid_callbacks[$callback];
      $full_bootstrap = FALSE;

      // Bootstrap to required level.
      if (!empty($info['bootstrap'])) {
        drupal_bootstrap($info['bootstrap']);
        $full_bootstrap = $info['bootstrap'] == DRUPAL_BOOTSTRAP_FULL;
      }
      if (!$full_bootstrap) {

        // The following mimics the behavior of _drupal_bootstrap_full().
        // @see _drupal_bootstrap_full(), common.inc
        // Load required include files.
        if (isset($info['includes']) && is_array($info['includes'])) {
          foreach ($info['includes'] as $include) {
            if (file_exists("./includes/{$include}.inc")) {
              require_once "./includes/{$include}.inc";
            }
          }
        }

        // Always load locale.inc.
        require_once "./includes/locale.inc";

        // Set the Drupal custom error handler.
        set_error_handler('drupal_error_handler');

        // Detect string handling method.
        if (function_exists('unicode_check')) {
          unicode_check();
        }

        // Undo magic quotes.
        fix_gpc_magic();

        // Load required modules.
        $modules = array(
          $module => 0,
        );
        if (isset($info['dependencies']) && is_array($info['dependencies'])) {

          // Intersect list with active modules to avoid loading uninstalled ones.
          $dependencies = array_intersect(module_list(TRUE, FALSE), $info['dependencies']);
        }

        // determine and return whether "filter" module is included:
        return $dependencies['filter'] == 'filter';
      }
      return $full_bootstrap == true;
      break;
    case 2:
      if (!$full_bootstrap) {
        if (is_array($dependencies) && !empty($dependencies)) {
          foreach ($dependencies as $dependency) {
            drupal_load('module', $dependency);
            $modules[$dependency] = 0;
          }
        }

        // Reset module list.
        module_list(FALSE, TRUE, FALSE, $modules);

        // Initialize the localization system.
        // @todo We actually need to query the database whether the site has any
        // localization module enabled, and load it automatically.
        $locale = drupal_init_language();
        if (empty($info['skip_hook_init'])) {

          // Invoke implementations of hook_init().
          module_invoke_all('init');
        }
      }

      // If the callback function is located in another file, load that file now.
      if (isset($info['file']) && ($filepath = drupal_get_path('module', $module) . '/' . $info['file']) && file_exists($filepath)) {
        require_once $filepath;
      }

      // Invoke callback function.
      return call_user_func_array($info['callback'], $args);
      break;
  }
}