protected function AjaxResponseAttachmentsProcessor::buildAttachmentsCommands

protected AjaxResponseAttachmentsProcessor::buildAttachmentsCommands(AjaxResponse $response, Request $request)

Prepares the AJAX commands to attach assets.

Parameters

\Drupal\Core\Ajax\AjaxResponse $response: The AJAX response to update.

\Symfony\Component\HttpFoundation\Request $request: The request object that the AJAX is responding to.

Return value

array An array of commands ready to be returned as JSON.

File

core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php, line 130

Class

AjaxResponseAttachmentsProcessor
Processes attachments of AJAX responses.

Namespace

Drupal\Core\Ajax

Code

protected function buildAttachmentsCommands(AjaxResponse $response, Request $request) {
  $ajax_page_state = $request->request->get('ajax_page_state');

  // Aggregate CSS/JS if necessary, but only during normal site operation.
  $optimize_css = !defined('MAINTENANCE_MODE') && $this->config->get('css.preprocess');
  $optimize_js = !defined('MAINTENANCE_MODE') && $this->config->get('js.preprocess');

  $attachments = $response->getAttachments();

  // Resolve the attached libraries into asset collections.
  $assets = new AttachedAssets();
  $assets->setLibraries(isset($attachments['library']) ? $attachments['library'] : [])
    ->setAlreadyLoadedLibraries(isset($ajax_page_state['libraries']) ? explode(',', $ajax_page_state['libraries']) : [])
    ->setSettings(isset($attachments['drupalSettings']) ? $attachments['drupalSettings'] : []);
  $css_assets = $this->assetResolver->getCssAssets($assets, $optimize_css);
  list($js_assets_header, $js_assets_footer) = $this->assetResolver->getJsAssets($assets, $optimize_js);

  // First, AttachedAssets::setLibraries() ensures duplicate libraries are
  // removed: it converts it to a set of libraries if necessary. Second,
  // AssetResolver::getJsSettings() ensures $assets contains the final set of
  // JavaScript settings. AttachmentsResponseProcessorInterface also mandates
  // that the response it processes contains the final attachment values, so
  // update both the 'library' and 'drupalSettings' attachments accordingly.
  $attachments['library'] = $assets->getLibraries();
  $attachments['drupalSettings'] = $assets->getSettings();
  $response->setAttachments($attachments);

  // Render the HTML to load these files, and add AJAX commands to insert this
  // HTML in the page. Settings are handled separately, afterwards.
  $settings = [];
  if (isset($js_assets_header['drupalSettings'])) {
    $settings = $js_assets_header['drupalSettings']['data'];
    unset($js_assets_header['drupalSettings']);
  }
  if (isset($js_assets_footer['drupalSettings'])) {
    $settings = $js_assets_footer['drupalSettings']['data'];
    unset($js_assets_footer['drupalSettings']);
  }

  // Prepend commands to add the assets, preserving their relative order.
  $resource_commands = array();
  if ($css_assets) {
    $css_render_array = $this->cssCollectionRenderer->render($css_assets);
    $resource_commands[] = new AddCssCommand($this->renderer->renderPlain($css_render_array));
  }
  if ($js_assets_header) {
    $js_header_render_array = $this->jsCollectionRenderer->render($js_assets_header);
    $resource_commands[] = new PrependCommand('head', $this->renderer->renderPlain($js_header_render_array));
  }
  if ($js_assets_footer) {
    $js_footer_render_array = $this->jsCollectionRenderer->render($js_assets_footer);
    $resource_commands[] = new AppendCommand('body', $this->renderer->renderPlain($js_footer_render_array));
  }
  foreach (array_reverse($resource_commands) as $resource_command) {
    $response->addCommand($resource_command, TRUE);
  }

  // Prepend a command to merge changes and additions to drupalSettings.
  if (!empty($settings)) {
    // During Ajax requests basic path-specific settings are excluded from
    // new drupalSettings values. The original page where this request comes
    // from already has the right values. An Ajax request would update them
    // with values for the Ajax request and incorrectly override the page's
    // values.
    // @see system_js_settings_alter()
    unset($settings['path']);
    $response->addCommand(new SettingsCommand($settings, TRUE), TRUE);
  }

  $commands = $response->getCommands();
  $this->moduleHandler->alter('ajax_render', $commands);

  return $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/core!lib!Drupal!Core!Ajax!AjaxResponseAttachmentsProcessor.php/function/AjaxResponseAttachmentsProcessor::buildAttachmentsCommands/8.1.x