From 65c46e9e418c2aada554092495ba92d68c853c15 Mon Sep 17 00:00:00 2001 From: Matthew Grasmick Date: Thu, 17 Nov 2016 11:50:46 -0500 Subject: [PATCH] Deleting active configuration when features module with conflicting config is installed. --- features.module | 37 +++++++++++++++++++++++++++++++++++++ src/FeaturesManager.php | 4 ++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/features.module b/features.module index 3fccc79..79ed10d 100644 --- a/features.module +++ b/features.module @@ -54,3 +54,40 @@ function features_modules_installed($modules) { $assigner->purgeConfiguration(); } } + +/** + * Implements hook_module_preinstall(). + */ +function features_module_preinstall($module) { + + $extension = \Drupal::moduleHandler()->getModule($module); + /** @var \Drupal\features\FeaturesManagerInterface $manager */ + $manager = \Drupal::service('features.manager'); + if (!$manager->isFeatureModule($extension, NULL)) { + return FALSE; + } + + $package = $manager->loadPackage($module, TRUE); + $config = $package->getConfig(); + if (empty($config['replace_active_config_on_install'])) { + return FALSE; + } + + // Config rewrites are stored in 'modulename/config/install'. + $config_install_dir = $extension->getPath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'install'; + + // Scan the rewrite directory for rewrites. + if (file_exists($config_install_dir) && $files = file_scan_directory($config_install_dir, '/^.*\.yml$/i')) { + foreach ($files as $file) { + // Parse the rewrites and retrieve the original config. + $original_config = \Drupal::configFactory()->getEditable($file->name); + if ($original_config) { + $original_config->delete(); + } + + // Log a message indicating whether the config was rewritten or not. + $message = t("@config_name was deleted from active configuration by features because @module defines the same config and has replace_active_config_on_install enabled.", ['@config_name' => $file->name, '@module' => $extension->getName()]); + \Drupal::logger('features')->info($message); + } + } +} diff --git a/src/FeaturesManager.php b/src/FeaturesManager.php index 67a1091..271592c 100644 --- a/src/FeaturesManager.php +++ b/src/FeaturesManager.php @@ -304,8 +304,8 @@ class FeaturesManager implements FeaturesManagerInterface { if ($any && !isset($package)) { // See if this is a non-features module. $module_list = $this->moduleHandler->getModuleList(); - if (!empty($module_list[$module])) { - $extension = $module_list[$module]; + if (!empty($module_list[$module_name])) { + $extension = $module_list[$module_name]; $package = $this->initPackageFromExtension($extension); $config = $this->listExtensionConfig($extension); $package->setConfig($config); -- 2.10.0