function js_execute_callback in JS Callback Handler 6
Same name and namespace in other branches
- 5.2 js.php \js_execute_callback()
- 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()
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;
}
}