Issue #2195957 by Wim Leers, alexpott: Fixed Only install profile configuration when installing that profile, not when enabling associated modules.

8.0.x
catch 2014-10-05 14:00:39 +02:00
parent 4b9f358a85
commit 5ab43b6a1a
3 changed files with 46 additions and 5 deletions

View File

@ -9,6 +9,7 @@ namespace Drupal\Core\Config;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Config\Entity\ConfigDependencyManager;
use Drupal\Core\Site\Settings;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class ConfigInstaller implements ConfigInstallerInterface {
@ -105,8 +106,16 @@ class ConfigInstaller implements ConfigInstallerInterface {
// Read enabled extensions directly from configuration to avoid circular
// dependencies with ModuleHandler and ThemeHandler.
$extension_config = $this->configFactory->get('core.extension');
$enabled_extensions = array_keys((array) $extension_config->get('module'));
$modules = (array) $extension_config->get('module');
// Unless we are installing the profile, remove it from the list.
if ($install_profile = Settings::get('install_profile')) {
if ($name !== $install_profile) {
unset($modules[$install_profile]);
}
}
$enabled_extensions = array_keys($modules);
$enabled_extensions += array_keys((array) $extension_config->get('theme'));
// Core can provide configuration.
$enabled_extensions[] = 'core';
@ -284,8 +293,9 @@ class ConfigInstaller implements ConfigInstallerInterface {
public function getSourceStorage($collection = StorageInterface::DEFAULT_COLLECTION) {
if (!isset($this->sourceStorage)) {
// Default to using the ExtensionInstallStorage which searches extension's
// config directories for default configuration.
$this->sourceStorage = new ExtensionInstallStorage($this->activeStorage, InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection);
// config directories for default configuration. Only include the profile
// configuration during Drupal installation.
$this->sourceStorage = new ExtensionInstallStorage($this->activeStorage, InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection, drupal_installation_attempted());
}
if ($this->sourceStorage->getCollectionName() != $collection) {
$this->sourceStorage = $this->sourceStorage->createCollection($collection);

View File

@ -7,6 +7,8 @@
namespace Drupal\Core\Config;
use Drupal\Core\Site\Settings;
/**
* Storage to access configuration and schema in enabled extensions.
*
@ -22,6 +24,13 @@ class ExtensionInstallStorage extends InstallStorage {
*/
protected $configStorage;
/**
* Flag to include the profile in the list of enabled modules.
*
* @var bool
*/
protected $includeProfile = TRUE;
/**
* Overrides \Drupal\Core\Config\InstallStorage::__construct().
*
@ -34,11 +43,15 @@ class ExtensionInstallStorage extends InstallStorage {
* @param string $collection
* (optional) The collection to store configuration in. Defaults to the
* default collection.
* @param bool $include_profile
* (optional) Whether to include the install profile in extensions to
* search.
*/
public function __construct(StorageInterface $config_storage, $directory = self::CONFIG_INSTALL_DIRECTORY, $collection = StorageInterface::DEFAULT_COLLECTION) {
public function __construct(StorageInterface $config_storage, $directory = self::CONFIG_INSTALL_DIRECTORY, $collection = StorageInterface::DEFAULT_COLLECTION, $include_profile = TRUE) {
$this->configStorage = $config_storage;
$this->directory = $directory;
$this->collection = $collection;
$this->includeProfile = $include_profile;
}
/**
@ -71,7 +84,13 @@ class ExtensionInstallStorage extends InstallStorage {
$extensions = $this->configStorage->read('core.extension');
if (!empty($extensions['module'])) {
$this->folders += $this->getComponentNames('module', array_keys($extensions['module']));
$modules = $extensions['module'];
if (!$this->includeProfile) {
if ($install_profile = Settings::get('install_profile')) {
unset($modules[$install_profile]);
}
}
$this->folders += $this->getComponentNames('module', array_keys($modules));
}
if (!empty($extensions['theme'])) {
$this->folders += $this->getComponentNames('theme', array_keys($extensions['theme']));

View File

@ -100,6 +100,18 @@ class StandardTest extends WebTestBase {
$config = $factory->get($name);
$this->assertConfigSchema($typed_config, $name, $config->get());
}
// Ensure that configuration from the Standard profile is not reused when
// enabling a module again since it contains configuration that can not be
// installed. For example, editor.editor.basic_html is editor configuration
// that depends on the ckeditor module. The ckeditor module can not be
// installed before the editor module since it depends on the editor module.
// The installer does not have this limitation since it ensures that all of
// the install profiles dependencies are installed before creating the
// editor configuration.
\Drupal::moduleHandler()->uninstall(array('editor', 'ckeditor'));
$this->rebuildContainer();
\Drupal::moduleHandler()->install(array('editor'));
}
}