Error message
You are browsing documentation for drupal 7.x, which is not supported anymore. Read the updated version of this page for drupal 11.x (the latest version).function ajax_render
Renders a commands array into JSON.
Parameters
$commands: A list of macro commands generated by the use of ajax_command_*() functions.
Related topics
- Ajax framework
- Functions for Drupal's Ajax framework.
1 call to ajax_render()
- ajax_deliver in includes/
ajax.inc - Packages and sends the result of a page callback as an Ajax response.
1 string reference to 'ajax_render'
- ajax_test_menu in modules/
simpletest/ tests/ ajax_test.module - Implements hook_menu().
File
-
includes/
ajax.inc, line 232
Code
function ajax_render ($commands = array()) {
// Although ajax_deliver() does this, some contributed and custom modules
// render Ajax responses without using that delivery callback.
ajax_set_verification_header ();
// Ajax responses aren't rendered with html.tpl.php, so we have to call
// drupal_get_css() and drupal_get_js() here, in order to have new files added
// during this request to be loaded by the page. We only want to send back
// files that the page hasn't already loaded, so we implement simple diffing
// logic using array_diff_key().
foreach (array(
'css',
'js',
) as $type) {
// It is highly suspicious if $_POST['ajax_page_state'][$type] is empty,
// since the base page ought to have at least one JS file and one CSS file
// loaded. It probably indicates an error, and rather than making the page
// reload all of the files, instead we return no new files.
if (empty($_POST['ajax_page_state'][$type])) {
$items[$type] = array();
}
else {
$function = 'drupal_add_' . $type;
$items[$type] = $function();
drupal_alter ($type, $items[$type]);
// @todo Inline CSS and JS items are indexed numerically. These can't be
// reliably diffed with array_diff_key(), since the number can change
// due to factors unrelated to the inline content, so for now, we strip
// the inline items from Ajax responses, and can add support for them
// when drupal_add_css() and drupal_add_js() are changed to use a hash
// of the inline content as the array key.
foreach ($items[$type] as $key => $item) {
if (is_numeric ($key)) {
unset($items[$type][$key]);
}
}
// Ensure that the page doesn't reload what it already has.
$items[$type] = array_diff_key ($items[$type], $_POST['ajax_page_state'][$type]);
}
}
// Render the HTML to load these files, and add AJAX commands to insert this
// HTML in the page. We pass TRUE as the $skip_alter argument to prevent the
// data from being altered again, as we already altered it above. Settings are
// handled separately, afterwards.
if (isset($items['js']['settings'])) {
unset($items['js']['settings']);
}
$styles = drupal_get_css ($items['css'], TRUE);
$scripts_footer = drupal_get_js ('footer', $items['js'], TRUE);
$scripts_header = drupal_get_js ('header', $items['js'], TRUE);
$extra_commands = array();
if (!empty($styles)) {
$extra_commands[] = ajax_command_add_css ($styles);
}
if (!empty($scripts_header)) {
$extra_commands[] = ajax_command_prepend ('head', $scripts_header);
}
if (!empty($scripts_footer)) {
$extra_commands[] = ajax_command_append ('body', $scripts_footer);
}
if (!empty($extra_commands)) {
$commands = array_merge ($extra_commands, $commands);
}
// Now add a command to merge changes and additions to Drupal.settings.
$scripts = drupal_add_js ();
drupal_alter ('js', $scripts);
if (!empty($scripts['settings'])) {
$settings = $scripts['settings'];
array_unshift ($commands, ajax_command_settings (drupal_array_merge_deep_array ($settings['data']), TRUE));
}
// Allow modules to alter any Ajax response.
drupal_alter ('ajax_render', $commands);
return drupal_json_encode ($commands);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.