function system_js_settings_alter in Drupal 8
Same name and namespace in other branches
- 9 core/modules/system/system.module \system_js_settings_alter()
Implements hook_js_settings_alter().
Sets values which depend on the current request, like core/drupalSettings as well as theme_token ajax state.
File
- core/
modules/ system/ system.module, line 728 - Configuration system that lets administrators modify the workings of the site.
Code
function system_js_settings_alter(&$settings, AttachedAssetsInterface $assets) {
// As this is being output in the final response always use the master
// request.
$request = \Drupal::requestStack()
->getMasterRequest();
$current_query = $request->query
->all();
// Let output path processors set a prefix.
/** @var \Drupal\Core\PathProcessor\OutboundPathProcessorInterface $path_processor */
$path_processor = \Drupal::service('path_processor_manager');
$options = [
'prefix' => '',
];
$path_processor
->processOutbound('/', $options);
$pathPrefix = $options['prefix'];
$route_match = \Drupal::routeMatch();
if ($route_match instanceof StackedRouteMatchInterface) {
$route_match = $route_match
->getMasterRouteMatch();
}
$current_path = $route_match
->getRouteName() ? Url::fromRouteMatch($route_match)
->getInternalPath() : '';
$current_path_is_admin = \Drupal::service('router.admin_context')
->isAdminRoute($route_match
->getRouteObject());
$path_settings = [
'baseUrl' => $request
->getBaseUrl() . '/',
'pathPrefix' => $pathPrefix,
'currentPath' => $current_path,
'currentPathIsAdmin' => $current_path_is_admin,
'isFront' => \Drupal::service('path.matcher')
->isFrontPage(),
'currentLanguage' => \Drupal::languageManager()
->getCurrentLanguage(LanguageInterface::TYPE_URL)
->getId(),
];
if (!empty($current_query)) {
ksort($current_query);
$path_settings['currentQuery'] = (object) $current_query;
}
// Only set core/drupalSettings values that haven't been set already.
foreach ($path_settings as $key => $value) {
if (!isset($settings['path'][$key])) {
$settings['path'][$key] = $value;
}
}
if (!isset($settings['pluralDelimiter'])) {
$settings['pluralDelimiter'] = PoItem::DELIMITER;
}
// Add the theme token to ajaxPageState, ensuring the database is available
// before doing so. Also add the loaded libraries to ajaxPageState.
/** @var \Drupal\Core\Asset\LibraryDependencyResolver $library_dependency_resolver */
$library_dependency_resolver = \Drupal::service('library.dependency_resolver');
if (isset($settings['ajaxPageState']) || in_array('core/drupal.ajax', $library_dependency_resolver
->getLibrariesWithDependencies($assets
->getAlreadyLoadedLibraries()))) {
if (!defined('MAINTENANCE_MODE')) {
// The theme token is only validated when the theme requested is not the
// default, so don't generate it unless necessary.
// @see \Drupal\Core\Theme\AjaxBasePageNegotiator::determineActiveTheme()
$active_theme_key = \Drupal::theme()
->getActiveTheme()
->getName();
if ($active_theme_key !== \Drupal::service('theme_handler')
->getDefault()) {
$settings['ajaxPageState']['theme_token'] = \Drupal::csrfToken()
->get($active_theme_key);
}
}
// Provide the page with information about the individual asset libraries
// used, information not otherwise available when aggregation is enabled.
$minimal_libraries = $library_dependency_resolver
->getMinimalRepresentativeSubset(array_unique(array_merge($assets
->getLibraries(), $assets
->getAlreadyLoadedLibraries())));
sort($minimal_libraries);
$settings['ajaxPageState']['libraries'] = implode(',', $minimal_libraries);
}
}