ThemeInstaller::install

public ThemeInstaller::install(array $theme_list, $install_dependencies = TRUE)

Installs a given list of themes.

Parameters

array $theme_list: An array of theme names.

bool $install_dependencies: (optional) If TRUE, dependencies will automatically be installed in the correct order. This incurs a significant performance cost, so use FALSE if you know $theme_list is already complete and in the correct order.

Return value

bool Whether any of the given themes have been installed.

Throws

\Drupal\Core\Extension\ExtensionNameLengthException Thrown when the theme name is to long.

Overrides ThemeInstallerInterface::install

File

core/lib/Drupal/Core/Extension/ThemeInstaller.php, line 100

Class

ThemeInstaller
Manages theme installation/uninstallation.

Namespace

Drupal\Core\Extension

Code

public function install(array $theme_list, $install_dependencies = TRUE) {
  $extension_config = $this->configFactory->getEditable('core.extension');

  $theme_data = $this->themeHandler->rebuildThemeData();

  if ($install_dependencies) {
    $theme_list = array_combine($theme_list, $theme_list);

    if ($missing = array_diff_key($theme_list, $theme_data)) {
      // One or more of the given themes doesn't exist.
      throw new \InvalidArgumentException('Unknown themes: ' . implode(', ', $missing) . '.');
    }

    // Only process themes that are not installed currently.
    $installed_themes = $extension_config->get('theme') ? : array();
    if (!$theme_list = array_diff_key($theme_list, $installed_themes)) {
      // Nothing to do. All themes already installed.
      return TRUE;
    }

    while (list($theme) = each($theme_list)) {
      // Add dependencies to the list. The new themes will be processed as
      // the while loop continues.
      foreach (array_keys($theme_data[$theme]->requires) as $dependency) {
        if (!isset($theme_data[$dependency])) {
          // The dependency does not exist.
          return FALSE;
        }

        // Skip already installed themes.
        if (!isset($theme_list[$dependency]) && !isset($installed_themes[$dependency])) {
          $theme_list[$dependency] = $dependency;
        }
      }
    }

    // Set the actual theme weights.
    $theme_list = array_map(function($theme) use ($theme_data) {
      return $theme_data[$theme]->sort;
    }, $theme_list);

    // Sort the theme list by their weights (reverse).
    arsort($theme_list);
    $theme_list = array_keys($theme_list);
  }
  else {
    $installed_themes = $extension_config->get('theme') ? : array();
  }

  $themes_installed = array();
  foreach ($theme_list as $key) {
    // Only process themes that are not already installed.
    $installed = $extension_config->get("theme.$key") !== NULL;
    if ($installed) {
      continue;
    }

    // Throw an exception if the theme name is too long.
    if (strlen($key) > DRUPAL_EXTENSION_NAME_MAX_LENGTH) {
      throw new ExtensionNameLengthException("Theme name $key is over the maximum allowed length of " . DRUPAL_EXTENSION_NAME_MAX_LENGTH . ' characters.');
    }

    // Validate default configuration of the theme. If there is existing
    // configuration then stop installing.
    $this->configInstaller->checkConfigurationToInstall('theme', $key);

    // The value is not used; the weight is ignored for themes currently. Do
    // not check schema when saving the configuration.
    $extension_config
    ->set("theme.$key", 0)
      ->save(TRUE);

    // Add the theme to the current list.
    // @todo Remove all code that relies on $status property.
    $theme_data[$key]->status = 1;
    $this->themeHandler->addTheme($theme_data[$key]);

    // Update the current theme data accordingly.
    $current_theme_data = $this->state->get('system.theme.data', array());
    $current_theme_data[$key] = $theme_data[$key];
    $this->state->set('system.theme.data', $current_theme_data);

    // Reset theme settings.
    $theme_settings = &drupal_static('theme_get_setting');
    unset($theme_settings[$key]);

    // @todo Remove system_list().
    $this->systemListReset();

    // Only install default configuration if this theme has not been installed
    // already.
    if (!isset($installed_themes[$key])) {
      // Install default configuration of the theme.
      $this->configInstaller->installDefaultConfig('theme', $key);
    }

    $themes_installed[] = $key;

    // Record the fact that it was installed.
    $this->logger->info('%theme theme installed.', array('%theme' => $key));
  }

  $this->cssCollectionOptimizer->deleteAll();
  $this->resetSystem();

  // Invoke hook_themes_installed() after the themes have been installed.
  $this->moduleHandler->invokeAll('themes_installed', array($themes_installed));

  return !empty($themes_installed);
}
doc_Drupal
2016-10-29 09:48:10
Comments
Leave a Comment

Please login to continue.