function ajax_render
ajax_render($commands = array())
Renders a commands array into JSON.
Parameters
$commands: A list of macro commands generated by the use of ajax_command_*() functions.
Related topics
File
- includes/ajax.inc, line 232
- Functions for use with Drupal's Ajax framework.
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(); 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); }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/includes!ajax.inc/function/ajax_render/7.x