You are here

public function ThemeController::setDefaultTheme in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/system/src/Controller/ThemeController.php \Drupal\system\Controller\ThemeController::setDefaultTheme()

Set the default theme.

Parameters

\Symfony\Component\HttpFoundation\Request $request: A request object containing a theme name.

Return value

\Symfony\Component\HttpFoundation\RedirectResponse|array Redirects back to the appearance admin page or the confirmation form if an experimental theme will be installed.

Throws

\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException Throws access denied when no theme is set in the request.

1 string reference to 'ThemeController::setDefaultTheme'
system.routing.yml in core/modules/system/system.routing.yml
core/modules/system/system.routing.yml

File

core/modules/system/src/Controller/ThemeController.php, line 211

Class

ThemeController
Controller for theme handling.

Namespace

Drupal\system\Controller

Code

public function setDefaultTheme(Request $request) {
  $config = $this->configFactory
    ->getEditable('system.theme');
  $theme = $request->query
    ->get('theme');
  if (isset($theme)) {

    // Get current list of themes.
    $themes = $this->themeHandler
      ->listInfo();

    // Display confirmation form if an experimental theme is being installed.
    if ($this
      ->willInstallExperimentalTheme($theme)) {
      return $this
        ->formBuilder()
        ->getForm(ThemeExperimentalConfirmForm::class, $theme, TRUE);
    }

    // Check if the specified theme is one recognized by the system.
    // Or try to install the theme.
    if (isset($themes[$theme]) || $this->themeInstaller
      ->install([
      $theme,
    ])) {
      $themes = $this->themeHandler
        ->listInfo();

      // Set the default theme.
      $config
        ->set('default', $theme)
        ->save();

      // The status message depends on whether an admin theme is currently in
      // use: a value of 0 means the admin theme is set to be the default
      // theme.
      $admin_theme = $config
        ->get('admin');
      if (!empty($admin_theme) && $admin_theme != $theme) {
        $this
          ->messenger()
          ->addStatus($this
          ->t('Please note that the administration theme is still set to the %admin_theme theme; consequently, the theme on this page remains unchanged. All non-administrative sections of the site, however, will show the selected %selected_theme theme by default.', [
          '%admin_theme' => $themes[$admin_theme]->info['name'],
          '%selected_theme' => $themes[$theme]->info['name'],
        ]));
      }
      else {
        $this
          ->messenger()
          ->addStatus($this
          ->t('%theme is now the default theme.', [
          '%theme' => $themes[$theme]->info['name'],
        ]));
      }
    }
    else {
      $this
        ->messenger()
        ->addError($this
        ->t('The %theme theme was not found.', [
        '%theme' => $theme,
      ]));
    }
    return $this
      ->redirect('system.themes_page');
  }
  throw new AccessDeniedHttpException();
}