diff --git a/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php b/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php new file mode 100644 index 0000000..263cedd --- /dev/null +++ b/core/lib/Drupal/Core/Config/ConfigFactoryOverrideBase.php @@ -0,0 +1,60 @@ +assertIdentical($config->get('language'), NULL); \Drupal::configFactory()->setOverrideState($old_state); + + // Test how overrides react to base configuration changes. Set up some base + // values. + \Drupal::languageManager() + ->getLanguageConfigOverride('de', 'config_test.overide') + ->set('value', 'override') + ->set('label', 'Override') + ->save(); + \Drupal::config('config_test.overide') + ->set('value', 'original') + ->set('label', 'Original') + ->save(); + $config = \Drupal::config('config_test.overide'); + $this->assertIdentical($config->get('value'), 'override'); + + // Ensure renaming the config will rename the override. + \Drupal::configFactory()->rename('config_test.overide', 'config_test.override'); + $config = \Drupal::config('config_test.override'); + $this->assertEqual($config->get('value'), 'original'); + $override = \Drupal::languageManager()->getLanguageConfigOverride('de', 'config_test.overide'); + $this->assertTrue($override->isNew()); + $this->assertEqual($override->get('value'), NULL); + $override = \Drupal::languageManager()->getLanguageConfigOverride('de', 'config_test.override'); + $this->assertFalse($override->isNew()); + $this->assertEqual($override->get('value'), 'override'); + + // Ensure changing data in the config will update the override. + $config = \Drupal::config('config_test.override')->clear('value')->save(); + $this->assertEqual($config->get('value'), NULL); + $override = \Drupal::languageManager()->getLanguageConfigOverride('de', 'config_test.override'); + $this->assertFalse($override->isNew()); + $this->assertEqual($override->get('value'), NULL); + + // Ensure deleting the config will delete the override. + \Drupal::configFactory()->get('config_test.override')->delete(); + $override = \Drupal::languageManager()->getLanguageConfigOverride('de', 'config_test.override'); + $this->assertTrue($override->isNew()); + $this->assertEqual($override->get('value'), NULL); } } diff --git a/core/modules/language/src/Config/LanguageConfigFactoryOverride.php b/core/modules/language/src/Config/LanguageConfigFactoryOverride.php index 6c71478..ddf738f 100644 --- a/core/modules/language/src/Config/LanguageConfigFactoryOverride.php +++ b/core/modules/language/src/Config/LanguageConfigFactoryOverride.php @@ -9,7 +9,10 @@ use Drupal\Component\Utility\String; use Drupal\Core\Config\ConfigCollectionInfo; +use Drupal\Core\Config\ConfigCrudEvent; use Drupal\Core\Config\ConfigEvents; +use Drupal\Core\Config\ConfigFactoryOverrideBase; +use Drupal\Core\Config\ConfigRenameEvent; use Drupal\Core\Config\StorageInterface; use Drupal\Core\Config\TypedConfigManagerInterface; use Drupal\Core\Language\LanguageDefault; @@ -20,7 +23,7 @@ /** * Provides language overrides for the configuration factory. */ -class LanguageConfigFactoryOverride implements LanguageConfigFactoryOverrideInterface, EventSubscriberInterface { +class LanguageConfigFactoryOverride extends ConfigFactoryOverrideBase implements LanguageConfigFactoryOverrideInterface, EventSubscriberInterface { /** * The configuration storage. @@ -194,10 +197,7 @@ protected function getLangcodeFromCollectionName($collection) { } /** - * Reacts to the ConfigEvents::COLLECTION_INFO event. - * - * @param \Drupal\Core\Config\ConfigCollectionInfo $collection_info - * The configuration collection names event. + * {@inheritdoc} */ public function addCollections(ConfigCollectionInfo $collection_info) { foreach (\Drupal::languageManager()->getLanguages() as $language) { @@ -208,9 +208,52 @@ public function addCollections(ConfigCollectionInfo $collection_info) { /** * {@inheritdoc} */ - static function getSubscribedEvents() { - $events[ConfigEvents::COLLECTION_INFO][] = array('addCollections'); - return $events; + public function onConfigSave(ConfigCrudEvent $event) { + $config = $event->getConfig(); + $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(); + } + } + } + + /** + * {@inheritdoc} + */ + public function onConfigRename(ConfigRenameEvent $event) { + $config = $event->getConfig(); + $name = $config->getName(); + $old_name = $event->getOldName(); + foreach (\Drupal::languageManager()->getLanguages() as $language) { + $config_translation = $this->getOverride($language->getId(), $old_name); + $saved_config = $config_translation->get(); + if (!empty($saved_config)) { + $storage = $this->getStorage($language->getId()); + $storage->write($name, $saved_config); + $config_translation->delete(); + } + } + } + + /** + * {@inheritdoc} + */ + public function onConfigDelete(ConfigCrudEvent $event) { + $config = $event->getConfig(); + $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(); + } + } } }