diff --git a/core/includes/ajax.inc b/core/includes/ajax.inc index b0b774663a77aaa3ced16c61461e74255b6af0b6..59941a0a9677efaa20c8898d309c42d2c0875301 100644 --- a/core/includes/ajax.inc +++ b/core/includes/ajax.inc @@ -5,8 +5,6 @@ * Functions for use with Drupal's Ajax framework. */ -use Drupal\Component\Utility\Json; - /** * @defgroup ajax Ajax framework * @{ @@ -227,152 +225,6 @@ * See @link ajax_commands Ajax framework commands @endlink */ -/** - * Renders a commands array into JSON. - * - * @param $commands - * A list of macro commands generated by the use of ajax_command_*() - * functions. - */ -function ajax_render($commands = array()) { - // Ajax responses aren't rendered with html.html.twig, 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 (!\Drupal::request()->request->get("ajax_page_state[$type]", NULL, TRUE)) { - $items[$type] = array(); - } - else { - $function = '_drupal_add_' . $type; - $items[$type] = $function(); - \Drupal::moduleHandler()->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 drupalSettings. - $scripts = _drupal_add_js(); - if (!empty($scripts['settings'])) { - $settings = drupal_merge_js_settings($scripts['settings']['data']); - array_unshift($commands, ajax_command_settings($settings, TRUE)); - } - - // Allow modules to alter any Ajax response. - \Drupal::moduleHandler()->alter('ajax_render', $commands); - - return Json::encode($commands); -} - -/** - * Converts the return value of a page callback into an Ajax commands array. - * - * @param $page_callback_result - * The result of a page callback. Can be one of: - * - NULL: to indicate no content. - * - An integer menu status constant: to indicate an error condition. - * - A string of HTML content. - * - A renderable array of content. - * - * @return - * An Ajax commands array that can be passed to ajax_render(). - */ -function ajax_prepare_response($page_callback_result) { - $commands = array(); - if (!isset($page_callback_result)) { - // Simply delivering an empty commands array is sufficient. This results - // in the Ajax request being completed, but nothing being done to the page. - } - elseif (is_int($page_callback_result)) { - switch ($page_callback_result) { - case MENU_NOT_FOUND: - $commands[] = ajax_command_alert(t('The requested page could not be found.')); - break; - - case MENU_ACCESS_DENIED: - $commands[] = ajax_command_alert(t('You are not authorized to access this page.')); - break; - - case MENU_SITE_OFFLINE: - $commands[] = ajax_command_alert(filter_xss_admin(t(\Drupal::config('system.maintenance')->get('message'), array('@site' => \Drupal::config('system.site')->get('name'))))); - break; - } - } - elseif (is_array($page_callback_result) && isset($page_callback_result['#type']) && ($page_callback_result['#type'] == 'ajax')) { - // Complex Ajax callbacks can return a result that contains an error message - // or a specific set of commands to send to the browser. - $page_callback_result += element_info('ajax'); - $error = $page_callback_result['#error']; - if (isset($error) && $error !== FALSE) { - if ((empty($error) || $error === TRUE)) { - $error = t('An error occurred while handling the request: The server received invalid input.'); - } - $commands[] = ajax_command_alert($error); - } - else { - $commands = $page_callback_result['#commands']; - } - } - else { - // Like normal page callbacks, simple Ajax callbacks can return HTML - // content, as a string or render array. This HTML is inserted in some - // relationship to #ajax['wrapper'], as determined by which jQuery DOM - // manipulation method is used. The method used is specified by - // #ajax['method']. The default method is 'replaceWith', which completely - // replaces the old wrapper element and its content with the new HTML. - $html = is_string($page_callback_result) ? $page_callback_result : drupal_render($page_callback_result); - $commands[] = ajax_command_insert(NULL, $html); - // Add the status messages inside the new content's wrapper element, so that - // on subsequent Ajax requests, it is treated as old content. - $status_messages = array('#theme' => 'status_messages'); - $commands[] = ajax_command_prepend(NULL, drupal_render($status_messages)); - } - - return $commands; -} - /** * Form element processing handler for the #ajax form property. *