diff --git a/core/modules/system/system.tokens.inc b/core/modules/system/system.tokens.inc index 33fcdae73b..dc4cc9fde9 100644 --- a/core/modules/system/system.tokens.inc +++ b/core/modules/system/system.tokens.inc @@ -37,12 +37,20 @@ function system_token_info() { 'description' => t("The administrative email address for the site."), ]; $site['logo'] = [ - 'name' => t("Logo"), - 'description' => t("The default site logo, or the logo of a specified theme."), + 'name' => t("Logo"), + 'description' => t("The default site logo."), ]; - $site['logo:url'] = [ - 'name' => t("Logo URL"), - 'description' => t("The URL of the default site logo, or the logo of a specified theme."), + $site['logo:?'] = [ + 'name' => t("Logo for a specific theme"), + 'description' => t("The site logo of a specified theme (use the theme's system name)."), + ]; + $site['logo-url'] = [ + 'name' => t("Logo URL"), + 'description' => t("The URL of the default site logo."), + ]; + $site['logo-url:?'] = [ + 'name' => t("Logo URL"), + 'description' => t("The URL of the site logo of a specified theme (use the theme's system name)."), ]; $site['url'] = [ 'name' => t("URL"), @@ -136,13 +144,10 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe break; case 'logo': - $config = \Drupal::config('system.theme.global'); - $bubbleable_metadata->addCacheableDependency($config); $default_theme = \Drupal::config('system.theme')->get('default'); - $theme_settings = \Drupal::config($default_theme . '.settings'); - $bubbleable_metadata->addCacheableDependency($theme_settings); + $theme = _system_tokens_get_actual_theme($default_theme, $bubbleable_metadata); + $logo_url = theme_get_setting('logo.url', $theme); - $logo_url = theme_get_setting('logo.url', $default_theme); $build = [ '#theme' => 'image', '#uri' => $logo_url, @@ -151,14 +156,9 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe break; case 'logo-url': - $config = \Drupal::config('system.theme.global'); - $bubbleable_metadata->addCacheableDependency($config); $default_theme = \Drupal::config('system.theme')->get('default'); - $theme_settings = \Drupal::config($default_theme . '.settings'); - $bubbleable_metadata->addCacheableDependency($theme_settings); - - $logo_url = theme_get_setting('logo.url', $default_theme); - $replacements[$original] = $logo_url; + $theme = _system_tokens_get_actual_theme($default_theme, $bubbleable_metadata); + $replacements[$original] = theme_get_setting('logo.url', $theme); break; case 'url': @@ -185,51 +185,32 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe } if ($created_tokens = $token_service->findWithPrefix($tokens, 'logo')) { + // Fetch all installed themes. + $themes = \Drupal::service('theme_handler')->listInfo(); + foreach ($created_tokens as $theme => $original) { // See if the requested theme was enabled. - $themes = \Drupal::service('theme_handler')->listInfo(); if (isset($themes[$theme])) { - // Retrieve configurations. - $config = \Drupal::config('system.theme.global'); - $theme_config = \Drupal::config($theme . '.settings'); - - // If there is no logo key, we set the theme to NULL to use the global - // fallback. - if (!$theme_config->get('logo.path')) { - $theme = NULL; - } - + $theme = _system_tokens_get_actual_theme($theme, $bubbleable_metadata); $logo_url = theme_get_setting('logo.url', $theme); $build = [ '#theme' => 'image', '#uri' => $logo_url, ]; $replacements[$original] = \Drupal::service('renderer')->renderPlain($build); - $bubbleable_metadata->addCacheableDependency($config); - $bubbleable_metadata->addCacheableDependency($theme_config); } } } if ($created_tokens = $token_service->findWithPrefix($tokens, 'logo-url')) { + // Fetch all installed themes. + $themes = \Drupal::service('theme_handler')->listInfo(); + foreach ($created_tokens as $theme => $original) { // See if the requested theme was enabled. - $themes = \Drupal::service('theme_handler')->listInfo(); if (isset($themes[$theme])) { - // Retrieve configurations. - $config = \Drupal::config('system.theme.global'); - $theme_config = \Drupal::config($theme . '.settings'); - - // If there is no logo key, we set the theme to NULL to use the global - // fallback. - if (!$theme_config->get('logo.path')) { - $theme = NULL; - } - + $theme = _system_tokens_get_actual_theme($theme, $bubbleable_metadata); $replacements[$original] = theme_get_setting('logo.url', $theme); - - $bubbleable_metadata->addCacheableDependency($config); - $bubbleable_metadata->addCacheableDependency($theme_config); } } } @@ -276,3 +257,28 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe return $replacements; } + +/** + * @param $theme + * The theme to load the logo for. + * @param \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata + * The bubbleable metadata to alter in order to cache the token. + * + * @return string|null + * The theme name, or NULL if the selected theme has no custom logo. + */ +function _system_tokens_get_actual_theme($theme, BubbleableMetadata &$bubbleable_metadata) { + // Retrieve configurations. + $config = \Drupal::config('system.theme.global'); + $theme_config = \Drupal::config($theme . '.settings'); + $bubbleable_metadata->addCacheableDependency($config); + $bubbleable_metadata->addCacheableDependency($theme_config); + + // If there is no logo key, we set the theme to NULL to use the global + // fallback. + if (!$theme_config->get('logo.path')) { + $theme = NULL; + } + + return $theme; +} diff --git a/core/modules/system/tests/src/Kernel/Token/TokenReplaceKernelTest.php b/core/modules/system/tests/src/Kernel/Token/TokenReplaceKernelTest.php index 4a5d3ca916..c66de52c2c 100644 --- a/core/modules/system/tests/src/Kernel/Token/TokenReplaceKernelTest.php +++ b/core/modules/system/tests/src/Kernel/Token/TokenReplaceKernelTest.php @@ -133,6 +133,7 @@ public function testSystemSiteTokenReplacement() { public function testSystemSiteLogoTokenReplacement() { // Install Bartik. \Drupal::service('theme_installer')->install(['bartik']); + \Drupal::service('theme_installer')->install(['seven']); // Set the default theme to bartik. $system_theme_config = $this->config('system.theme'); @@ -147,6 +148,13 @@ public function testSystemSiteLogoTokenReplacement() { ->set('logo.use_default', false) ->save(); + // Set the seven configuration. + $seven_config = $this->config('seven.settings'); + $seven_config + ->set('logo.path', '/path/to/seven_logo.svg') + ->set('logo.use_default', false) + ->save(); + // Prepare the render array for the expected logo. $build = [ '#theme' => 'image', @@ -154,23 +162,36 @@ public function testSystemSiteLogoTokenReplacement() { ]; $global_logo = \Drupal::service('renderer')->renderPlain($build); + // Prepare the render array for the seven logo. + $build = [ + '#theme' => 'image', + '#uri' => $seven_config->get('logo.path'), + ]; + $seven_logo = \Drupal::service('renderer')->renderPlain($build); + // Generate and test tokens. $tests = []; $tests['[site:logo]'] = $global_logo; $tests['[site:logo:bartik]'] = $global_logo; + $tests['[site:logo:seven]'] = $seven_logo; $tests['[site:logo:not-enabled-theme]'] = '[site:logo:not-enabled-theme]'; $tests['[site:logo-url]'] = $system_theme_global_config->get('logo.path'); $tests['[site:logo-url:bartik]'] = $system_theme_global_config->get('logo.path'); + $tests['[site:logo-url:seven]'] = $seven_config->get('logo.path'); $metadata_tests['[site:logo]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global')) ->addCacheableDependency(\Drupal::config('bartik.settings')); $metadata_tests['[site:logo:bartik]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global')) ->addCacheableDependency(\Drupal::config('bartik.settings')); + $metadata_tests['[site:logo:seven]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global')) + ->addCacheableDependency(\Drupal::config('seven.settings')); $metadata_tests['[site:logo:not-enabled-theme]'] = new BubbleableMetadata(); $metadata_tests['[site:logo-url]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global')) ->addCacheableDependency(\Drupal::config('bartik.settings')); $metadata_tests['[site:logo-url:bartik]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global')) ->addCacheableDependency(\Drupal::config('bartik.settings')); + $metadata_tests['[site:logo-url:seven]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global')) + ->addCacheableDependency(\Drupal::config('bartik.seven')); // Test to make sure that we generated something for each token. $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.'); @@ -178,8 +199,8 @@ public function testSystemSiteLogoTokenReplacement() { foreach ($tests as $input => $expected) { $bubbleable_metadata = new BubbleableMetadata(); $output = $this->tokenService->replace($input, [], ['langcode' => $this->interfaceLanguage->getId()], $bubbleable_metadata); - $this->assertEqual($output, $expected, new FormattableMarkup('System site information token %token replaced.', ['%token' => $input])); - $this->assertEqual($bubbleable_metadata, $metadata_tests[$input]); + $this->assertEquals($expected, $output, new FormattableMarkup('System site information token %token replaced.', ['%token' => $input])); + $this->assertEquals($metadata_tests[$input], $bubbleable_metadata); } // Now override the global settings with theme specific settings. @@ -205,15 +226,19 @@ public function testSystemSiteLogoTokenReplacement() { $tests = []; $tests['[site:logo]'] = $theme_logo; $tests['[site:logo:bartik]'] = $theme_logo; + $tests['[site:logo:seven]'] = $seven_logo; $tests['[site:logo:not-enabled-theme]'] = '[site:logo:not-enabled-theme]'; $tests['[site:logo-url]'] = $theme_config->get('logo.path'); $tests['[site:logo-url:bartik]'] = $theme_config->get('logo.path'); + $tests['[site:logo-url:seven]'] = $seven_config->get('logo.path'); $tests['[site:logo-url:not-enabled-theme]'] = '[site:logo-url:not-enabled-theme]'; $metadata_tests['[site:logo]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global'))->addCacheableDependency($theme_config); $metadata_tests['[site:logo:bartik]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global'))->addCacheableDependency($theme_config); + $metadata_tests['[site:logo:seven]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global'))->addCacheableDependency($seven_config); $metadata_tests['[site:logo:not-enabled-theme]'] = new BubbleableMetadata(); $metadata_tests['[site:logo-url]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global'))->addCacheableDependency($theme_config); $metadata_tests['[site:logo-url:bartik]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global'))->addCacheableDependency($theme_config); + $metadata_tests['[site:logo-url:seven]'] = BubbleableMetadata::createFromObject(\Drupal::config('system.theme.global'))->addCacheableDependency($seven_config); $metadata_tests['[site:logo-url:not-enabled-theme]'] = new BubbleableMetadata(); // Test to make sure that we generated something for each token. @@ -222,8 +247,8 @@ public function testSystemSiteLogoTokenReplacement() { foreach ($tests as $input => $expected) { $bubbleable_metadata = new BubbleableMetadata(); $output = $this->tokenService->replace($input, [], ['langcode' => $this->interfaceLanguage->getId()], $bubbleable_metadata); - $this->assertEqual($output, $expected, new FormattableMarkup('System site information token %token replaced.', ['%token' => $input])); - $this->assertEqual($bubbleable_metadata, $metadata_tests[$input]); + $this->assertEquals($expected, $output, new FormattableMarkup('System site information token %token replaced.', ['%token' => $input])); + $this->assertEquals($metadata_tests[$input], $bubbleable_metadata); } }