function ThemeInitialization::getActiveThemeByName

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Theme/ThemeInitialization.php \Drupal\Core\Theme\ThemeInitialization::getActiveThemeByName()
  2. 8.9.x core/lib/Drupal/Core/Theme/ThemeInitialization.php \Drupal\Core\Theme\ThemeInitialization::getActiveThemeByName()
  3. 11.x core/lib/Drupal/Core/Theme/ThemeInitialization.php \Drupal\Core\Theme\ThemeInitialization::getActiveThemeByName()
1 call to ThemeInitialization::getActiveThemeByName()
ThemeInitialization::initTheme in core/lib/Drupal/Core/Theme/ThemeInitialization.php

File

core/lib/Drupal/Core/Theme/ThemeInitialization.php, line 82

Class

ThemeInitialization
Provides the theme initialization logic.

Namespace

Drupal\Core\Theme

Code

public function getActiveThemeByName($theme_name) {
  if ($cached = $this->cache
    ->get('theme.active_theme.' . $theme_name)) {
    return $cached->data;
  }
  $themes = $this->themeHandler
    ->listInfo();
  // If no theme could be negotiated, or if the negotiated theme is not within
  // the list of installed themes, fall back to the default theme output of
  // core and modules (like Stark, but without a theme extension at all). This
  // is possible, because loadActiveTheme() always loads the Twig theme
  // engine. This is desired, because missing or malformed theme configuration
  // should not leave the application in a broken state. By falling back to
  // default output, the user is able to reconfigure the theme through the UI.
  // Lastly, tests are expected to operate with no theme by default, so as to
  // only assert the original theme output of modules (unless a test manually
  // installs a specific theme).
  if (empty($themes) || !$theme_name || !isset($themes[$theme_name])) {
    $theme_name = 'core';
    // /core/core.info.yml does not actually exist, but is required because
    // Extension expects a pathname.
    $active_theme = $this->getActiveTheme(new Extension($this->root, 'theme', 'core/core.info.yml'));
    // Early-return and do not set state, because the initialized $theme_name
    // differs from the original $theme_name.
    return $active_theme;
  }
  // Find all our ancestor themes and put them in an array.
  $base_themes = [];
  $ancestor = $theme_name;
  while ($ancestor && isset($themes[$ancestor]->base_theme)) {
    $ancestor = $themes[$ancestor]->base_theme;
    if (!$this->themeHandler
      ->themeExists($ancestor)) {
      throw new MissingThemeDependencyException(sprintf('Base theme %s has not been installed.', $ancestor), $ancestor);
    }
    $base_themes[] = $themes[$ancestor];
  }
  $active_theme = $this->getActiveTheme($themes[$theme_name], $base_themes);
  $this->cache
    ->set('theme.active_theme.' . $theme_name, $active_theme);
  return $active_theme;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.