diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php index 0d17bef..e1f5fbc 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php @@ -130,11 +130,22 @@ public function requiresEntityStorageSchemaChanges(EntityTypeInterface $entity_t $entity_type->getStorageClass() != $original->getStorageClass() || $entity_type->isRevisionable() != $original->isRevisionable() || $entity_type->isTranslatable() != $original->isTranslatable() || + $this->hasSharedTableNameChanges($entity_type, $original) || // Detect changes in key or index definitions. - $this->getEntitySchemaData($entity_type, $this->getEntitySchema($entity_type, TRUE)) != $this->loadEntitySchemaData($original) || - $this->hasSharedTableNameChanges($entity_type, $original); + $this->getEntitySchemaData($entity_type, $this->getEntitySchema($entity_type, TRUE)) != $this->loadEntitySchemaData($original); } + /** + * Detects whether any table name got renamed in an entity type update. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + * The new entity type. + * @param \Drupal\Core\Entity\EntityTypeInterface $original + * The origin entity type. + * + * @return bool + * Returns TRUE if there have been changes. + */ protected function hasSharedTableNameChanges(EntityTypeInterface $entity_type, EntityTypeInterface $original) { return $entity_type->getBaseTable() != $original->getBaseTable() || diff --git a/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php b/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php index d70c288..78680b0 100644 --- a/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php +++ b/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php @@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityTypeEventSubscriberTrait; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Entity\Sql\SqlContentEntityStorage; use Drupal\Core\Field\FieldStorageDefinitionEventSubscriberTrait; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\views\Views; @@ -109,6 +110,12 @@ public function onEntityTypeCreate(EntityTypeInterface $entity_type) { public function onEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeInterface $original) { $changes = []; + // We implement a specific logic for table updates, which is bound to the + // default sql content entity storage. + if (!$this->entityManager->getStorage($entity_type->id()) instanceof SqlContentEntityStorage) { + return; + } + // Checks for base tables. if ($entity_type->getBaseTable() != $original->getBaseTable()) { $changes[] = static::BASE_TABLE_RENAME; @@ -164,7 +171,6 @@ public function onEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeI $this->dataTableRemoval($all_views, $entity_type->id(), $original->getDataTable(), $entity_type->getBaseTable()); break; case static::REVISION_TABLE_RENAME: - // @FIXME the update on revision table rename is not triggered. $this->baseTableRename($all_views, $entity_type->id(), $original->getRevisionTable(), $entity_type->getRevisionTable()); break; case static::REVISION_TABLE_ADDITION: @@ -194,7 +200,13 @@ public function onEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeI * {@inheritdoc} */ public function onEntityTypeDelete(EntityTypeInterface $entity_type) { - $base_table = $entity_type->getBaseTable(); + $tables = [ + $entity_type->getBaseTable(), + $entity_type->getDataTable(), + $entity_type->getRevisionTable(), + $entity_type->getRevisionDataTable(), + ]; + $entity_type_id = $entity_type->id(); $all_views = $this->entityManager->getStorage('view')->loadMultiple(NULL); @@ -202,7 +214,7 @@ public function onEntityTypeDelete(EntityTypeInterface $entity_type) { foreach ($all_views as $id => $view) { // First check just the base table. - if ($view->get('base_table') == $base_table) { + if (in_array($view->get('base_table'), $tables)) { $view->disable(); $view->save(); } diff --git a/core/modules/views/src/Tests/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php b/core/modules/views/src/Tests/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php index b5abdc4..38ac228 100644 --- a/core/modules/views/src/Tests/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php +++ b/core/modules/views/src/Tests/EventSubscriber/ViewsEntitySchemaSubscriberIntegrationTest.php @@ -99,8 +99,12 @@ public function testDeleteEntityType() { $entity_storage = $this->entityManager->getStorage('view'); $views = $entity_storage->loadMultiple(); - // User module provides 3 views for themselves. - $this->assertEqual(7, count($views)); + + // Ensure that all test views exists. + $this->assertTrue(isset($views['test_view_entity_test'])); + $this->assertTrue(isset($views['test_view_entity_test_revision'])); + $this->assertTrue(isset($views['test_view_entity_test_data'])); + $this->assertTrue(isset($views['test_view_entity_test_additional_base_field'])); $event = new EntityTypeEvent($this->entityManager->getDefinition('entity_test_update')); $this->eventDispatcher->dispatch(EntityTypeEvents::DELETE, $event); @@ -108,9 +112,17 @@ public function testDeleteEntityType() { // We expect that views which use 'entity_test_update' as base tables are // disabled. $views = $entity_storage->loadMultiple(); - $this->assertEqual(7, count($views)); + // Ensure that all test views still exists after the deletion of the + // entity type. + $this->assertTrue(isset($views['test_view_entity_test'])); + $this->assertTrue(isset($views['test_view_entity_test_revision'])); + $this->assertTrue(isset($views['test_view_entity_test_data'])); + $this->assertTrue(isset($views['test_view_entity_test_additional_base_field'])); + + // Ensure that they are all disabled. $this->assertFalse($views['test_view_entity_test']->status()); + $this->assertFalse($views['test_view_entity_test_revision']->status()); $this->assertFalse($views['test_view_entity_test_data']->status()); $this->assertFalse($views['test_view_entity_test_additional_base_field']->status()); } @@ -140,6 +152,14 @@ public function testDataTableRename() { $this->updateEntityTypeToTranslatable(); $this->entityDefinitionUpdateManager->applyUpdates(); + $entity_storage = $this->entityManager->getStorage('view'); + $view = $entity_storage->load('test_view_entity_test_data'); + $this->assertEqual('entity_test_update', $view->get('base_table')); + $display = $view->getDisplay('default'); + $this->assertEqual('entity_test_update', $display['display_options']['fields']['id']['table']); + // Ensure that the data table is used. + $this->assertEqual('entity_test_update_data', $display['display_options']['fields']['name']['table']); + $this->renameDataTable(); $this->entityDefinitionUpdateManager->applyUpdates(); @@ -161,6 +181,14 @@ public function testRevisionBaseTableRename() { $this->updateEntityTypeToRevisionable(); $this->entityDefinitionUpdateManager->applyUpdates(); + /** @var \Drupal\views\Entity\View $view */ + $entity_storage = $this->entityManager->getStorage('view'); + $view = $entity_storage->load('test_view_entity_test_revision'); + $this->assertEqual('entity_test_update_revision', $view->get('base_table')); + $display = $view->getDisplay('default'); + $this->assertEqual('entity_test_update_revision', $display['display_options']['fields']['id']['table']); + $this->assertEqual('entity_test_update_revision', $display['display_options']['fields']['name']['table']); + $this->renameRevisionBaseTable(); $this->entityDefinitionUpdateManager->applyUpdates(); @@ -183,6 +211,14 @@ public function testRevisionDataTableRename() { $this->updateEntityTypeToTranslatable(); $this->entityDefinitionUpdateManager->applyUpdates(); + /** @var \Drupal\views\Entity\View $view */ + $entity_storage = $this->entityManager->getStorage('view'); + $view = $entity_storage->load('test_view_entity_test_revision'); + $this->assertEqual('entity_test_update_revision', $view->get('base_table')); + $display = $view->getDisplay('default'); + $this->assertEqual('entity_test_update_revision', $display['display_options']['fields']['id']['table']); + $this->assertEqual('entity_test_update_revision_data', $display['display_options']['fields']['name']['table']); + $this->renameRevisionDataTable(); $this->entityDefinitionUpdateManager->applyUpdates();