function AjaxResponseAttachmentsProcessor::buildAttachmentsCommands
Same name in other branches
- 8.9.x core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php \Drupal\Core\Ajax\AjaxResponseAttachmentsProcessor::buildAttachmentsCommands()
- 10 core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php \Drupal\Core\Ajax\AjaxResponseAttachmentsProcessor::buildAttachmentsCommands()
- 11.x core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php \Drupal\Core\Ajax\AjaxResponseAttachmentsProcessor::buildAttachmentsCommands()
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.
1 call to AjaxResponseAttachmentsProcessor::buildAttachmentsCommands()
- AjaxResponseAttachmentsProcessor::processAttachments in core/
lib/ Drupal/ Core/ Ajax/ AjaxResponseAttachmentsProcessor.php - Processes the attachments of a response that has attachments.
File
-
core/
lib/ Drupal/ Core/ Ajax/ AjaxResponseAttachmentsProcessor.php, line 130
Class
- AjaxResponseAttachmentsProcessor
- Processes attachments of AJAX responses.
Namespace
Drupal\Core\AjaxCode
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($attachments['library'] ?? [])
->setAlreadyLoadedLibraries(isset($ajax_page_state['libraries']) ? explode(',', $ajax_page_state['libraries']) : [])
->setSettings($attachments['drupalSettings'] ?? []);
$css_assets = $this->assetResolver
->getCssAssets($assets, $optimize_css);
[
$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 = [];
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 AddJsCommand(array_column($js_header_render_array, '#attributes'), 'head');
}
if ($js_assets_footer) {
$js_footer_render_array = $this->jsCollectionRenderer
->render($js_assets_footer);
$resource_commands[] = new AddJsCommand(array_column($js_footer_render_array, '#attributes'));
}
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;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.