diff --git a/core/includes/config.inc b/core/includes/config.inc index 2857c68..7875be7 100644 --- a/core/includes/config.inc +++ b/core/includes/config.inc @@ -8,6 +8,7 @@ use Drupal\Core\Config\FileStorage; use Drupal\Core\Config\StorageInterface; use Drupal\Core\Config\ExtensionInstallStorageComparer; +use Drupal\Core\Config\Entity\ConfigStorageController; use Symfony\Component\Yaml\Dumper; /** @@ -92,6 +93,20 @@ function ($value) use ($name) { * The name of the module or theme to install default configuration for. */ function config_uninstall_default_config($type, $name) { + // Handle config entities. + if ($type == 'module') { + foreach (\Drupal::entityManager()->getDefinitions() as $entity_type => $entity_info) { + if ($entity_info['module'] == $name && isset($entity_info['config_prefix']) ) { + $ids = config_get_storage_names_with_prefix($entity_info['config_prefix'] . '.'); + foreach ($ids as &$id) { + $id = ConfigStorageController::getIDFromConfigName($id, $entity_info['config_prefix']); + } + entity_delete_multiple($entity_type, $ids); + } + } + } + + // Simple config. $storage = drupal_container()->get('config.storage'); $config_names = $storage->listAll($name . '.'); foreach ($config_names as $config_name) { diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php index 3bb7839..5c40fab 100644 --- a/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php @@ -90,6 +90,25 @@ function testIntegrationModuleReinstallation() { $config_entity = \Drupal::config($default_configuration_entity); $this->assertIdentical($config_entity->isNew(), FALSE); $this->assertIdentical($config_entity->get('label'), 'Customized integration config label'); + + // Uninstall the config_test module + // First uninstall the dependency on the config_integration_test + \Drupal::moduleHandler()->uninstall(array('config_integration_test')); + + // The entity exists + $this->assertIdentical($config_entity->get('label'), 'Customized integration config label'); + + // Clear the delete flag + \Drupal::state()->set('ConfigTestStorageController.deleteCalled', FALSE); + + \Drupal::moduleHandler()->uninstall(array('config_test')); + + // Set if delete has been called + $this->assertIdentical(\Drupal::state()->get('ConfigTestStorageController.deleteCalled'), TRUE); + + // Verify that the entity has been removed. + $this->assertIdentical($config_entity->get('label'), NULL); + $this->assertIdentical($config_entity->isNew(), TRUE); } } diff --git a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestStorageController.php b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestStorageController.php index a73cffb..93b2e42 100644 --- a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestStorageController.php +++ b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTestStorageController.php @@ -45,4 +45,11 @@ public function importDelete($name, Config $new_config, Config $old_config) { return parent::importDelete($name, $new_config, $old_config); } + /** + * Implements Drupal\Core\Entity\EntityStorageControllerInterface::delete(). + */ + public function delete(array $entities) { + \Drupal::state()->set('ConfigTestStorageController.deleteCalled', TRUE); + parent::delete($entities); + } }