diff --git a/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php b/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php index 263cedd..681f36f 100644 --- a/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php +++ b/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php @@ -57,4 +57,57 @@ static function getSubscribedEvents() { return $events; } + /** + * Filters data in the override based on what is currently in configuration. + * + * @param Config $config + * Current configuration object. + * @param $override + * Override object corresponding to the configuration to filter data in. + */ + static function filterOverride(Config $config, $override) { + $override_data = $override->get(); + static::filterNestedArray($config->get(), $override_data); + if (empty($override_data)) { + // If no override values are left that would apply, remove the override. + $override->delete(); + } + else { + // Otherwise set the filtered override values back. + $override->setData($override_data)->save(); + } + } + + /** + * Filters data in nested arrays. + * + * @param array $original_data + * Original data array to filter against. + * @param array $override_data + * Override data to filter. + */ + static function filterNestedArray(array $original_data, array &$override_data) { + foreach ($override_data as $key => $value) { + if (!isset($original_data[$key])) { + // The original data is not there anymore, remove the override. + unset($override_data[$key]); + } + elseif (is_array($override_data[$key])) { + if (is_array($original_data[$key])) { + // Do the filtering one level deeper. + static::filterNestedArray($original_data[$key], $override_data[$key]); + // If no overrides are left under this level, remove the level. + if (empty($override_data[$key])) { + unset($override_data[$key]); + } + } + else { + // The override is an array but the value is not, this will not go + // well, remove the override. + unset($override_data[$key]); + } + } + } + } + } diff --git a/core/modules/language/src/Config/LanguageConfigFactoryOverride.php b/core/modules/language/src/Config/LanguageConfigFactoryOverride.php index ddf738f..cb14fe7 100644 --- a/core/modules/language/src/Config/LanguageConfigFactoryOverride.php +++ b/core/modules/language/src/Config/LanguageConfigFactoryOverride.php @@ -213,13 +213,7 @@ public function onConfigSave(ConfigCrudEvent $event) { $name = $config->getName(); foreach (\Drupal::languageManager()->getLanguages() as $language) { $config_translation = $this->getOverride($language->getId(), $name); - $saved_config = $config_translation->get(); - if (empty($saved_config)) { - $config_translation->delete(); - } - else { - $config_translation->save(); - } + static::filterOverride($config, $config_translation); } }