diff --git a/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php b/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php index 3fcb99a..c1bd594 100644 --- a/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php +++ b/core/modules/views/src/EventSubscriber/ViewsEntitySchemaSubscriber.php @@ -116,41 +116,44 @@ public function onEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeI return; } - // Checks for base tables. if ($entity_type->getBaseTable() != $original->getBaseTable()) { $changes[] = static::BASE_TABLE_RENAME; } - // Checks for data tables. - if ($entity_type->getDataTable() !== NULL && $original->getDataTable() !== NULL && $entity_type->getDataTable() != $original->getDataTable()) { - $changes[] = static::DATA_TABLE_RENAME; + $revision_add = $entity_type->isRevisionable() && !$original->isRevisionable(); + $revision_remove = !$entity_type->isRevisionable() && $original->isRevisionable(); + $translation_add = $entity_type->isTranslatable() && !$original->isTranslatable(); + $translation_remove = !$entity_type->isTranslatable() && $original->isTranslatable(); + + if ($revision_add) { + $changes[] = static::REVISION_TABLE_ADDITION; } - elseif ($original->getDataTable() === NULL && $entity_type->getDataTable()) { - $changes[] = static::DATA_TABLE_ADDITION; + elseif ($revision_remove) { + $changes[] = static::REVISION_TABLE_REMOVAL; } - elseif ($original->getDataTable() && $entity_type->getDataTable() === NULL) { - $changes[] = static::DATA_TABLE_REMOVAL; + elseif ($entity_type->isRevisionable() && $entity_type->getRevisionTable() != $original->getRevisionTable()) { + $changes[] = static::REVISION_TABLE_RENAME; } - // Checks for revision tables. - if ($original->getRevisionTable() !== NULL && $entity_type->getRevisionTable() != $original->getRevisionTable()) { - $changes[] = static::REVISION_TABLE_RENAME; + if ($translation_add) { + $changes[] = static::DATA_TABLE_ADDITION; } - elseif ($original->getRevisionTable() === NULL && $entity_type->getRevisionTable()) { - $changes[] = static::REVISION_TABLE_ADDITION; + elseif ($translation_remove) { + $changes[] = static::DATA_TABLE_REMOVAL; } - elseif ($original->isRevisionable() && !$entity_type->isRevisionable()) { - $changes[] = static::REVISION_TABLE_REMOVAL; + elseif ($entity_type->isTranslatable() && $entity_type->getDataTable() != $original->getDataTable()) { + $changes[] = static::DATA_TABLE_RENAME; } - // Checks for revision data tables. - if ($entity_type->getRevisionDataTable() !== NULL && $original->getRevisionDataTable() !== NULL && $entity_type->getRevisionDataTable() != $original->getRevisionDataTable()) { - $changes[] = static::REVISION_DATA_TABLE_RENAME; - } - elseif ($original->getRevisionDataTable() === NULL && $entity_type->getRevisionDataTable()) { - $changes[] = static::REVISION_DATA_TABLE_ADDITION; + if ($entity_type->isRevisionable() && $entity_type->isTranslatable()) { + if ($revision_add || $translation_add) { + $changes[] = static::REVISION_DATA_TABLE_ADDITION; + } + elseif ($entity_type->getRevisionDataTable() != $original->getRevisionDataTable()) { + $changes[] = static::REVISION_DATA_TABLE_RENAME; + } } - elseif ($original->getRevisionDataTable() && $entity_type->getRevisionDataTable() === NULL) { + elseif ($original->isRevisionable() && $original->isTranslatable() && ($revision_remove || $translation_remove)) { $changes[] = static::REVISION_DATA_TABLE_REMOVAL; } @@ -165,7 +168,7 @@ public function onEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeI $this->dataTableRename($all_views, $entity_type->id(), $original->getDataTable(), $entity_type->getDataTable()); break; case static::DATA_TABLE_ADDITION: - $this->dataTableAddition($all_views, $entity_type, $entity_type->getDataTable(),$entity_type->getBaseTable()); + $this->dataTableAddition($all_views, $entity_type, $entity_type->getDataTable(), $entity_type->getBaseTable()); break; case static::DATA_TABLE_REMOVAL: $this->dataTableRemoval($all_views, $entity_type->id(), $original->getDataTable(), $entity_type->getBaseTable()); @@ -183,7 +186,7 @@ public function onEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeI $this->dataTableRename($all_views, $entity_type->id(), $original->getRevisionDataTable(), $entity_type->getRevisionDataTable()); break; case static::REVISION_DATA_TABLE_ADDITION: - $this->dataTableAddition($all_views, $entity_type, $entity_type->getRevisionDataTable(),$entity_type->getRevisionTable()); + $this->dataTableAddition($all_views, $entity_type, $entity_type->getRevisionDataTable(), $entity_type->getRevisionTable()); break; case static::REVISION_DATA_TABLE_REMOVAL: $this->dataTableRemoval($all_views, $entity_type->id(), $original->getRevisionDataTable(), $entity_type->getRevisionTable()); @@ -207,8 +210,6 @@ public function onEntityTypeDelete(EntityTypeInterface $entity_type) { $entity_type->getRevisionDataTable(), ]; - $entity_type_id = $entity_type->id(); - $all_views = $this->entityManager->getStorage('view')->loadMultiple(NULL); /** @var \Drupal\views\Entity\View $view */ foreach ($all_views as $id => $view) { @@ -218,24 +219,6 @@ public function onEntityTypeDelete(EntityTypeInterface $entity_type) { $view->disable(); $view->save(); } - - // Unset all handlers which point to no longer existing entity types. - // @todo How can we ensure that we don't break views, see - // https://www.drupal.org/node/2401467 - foreach (array_keys($view->get('display')) as $display_id) { - $display = &$view->getDisplay($display_id); - foreach (Views::getHandlerTypes() as $handler_type) { - $handler_type = $handler_type['plural']; - if (!isset($display['display_options'][$handler_type])) { - continue; - } - foreach ($display['display_options'][$handler_type] as &$handler_config) { - if (isset($handler_config['entity_type']) && $handler_config['entity_type'] == $entity_type_id) { - unset($handler_config); - } - } - } - } } } @@ -264,6 +247,14 @@ public function onFieldStorageDefinitionDelete(FieldStorageDefinitionInterface $ } } + /** + * Applies a callable onto all handlers of all passed in views. + * + * @param \Drupal\views\Entity\View[] $all_views + * All views entities. + * @param callable $process + * A callable which retrieves a handler config array. + */ protected function processHandlers(array $all_views, callable $process) { foreach ($all_views as $view) { foreach (array_keys($view->get('display')) as $display_id) { @@ -424,9 +415,6 @@ protected function revisionRemoval($all_views, EntityTypeInterface $original) { if (in_array($view->get('base_table'), [$revision_base_table, $revision_data_table])) { // Let's disable the views as we no longer support revisions. $view->setStatus(FALSE); - // @todo Discuss whether we might even want to remove them. In general - // though we should avoid changing the system silently into a - // unrecoverable state. } // For any kind of field, let's rely on the broken handler functionality.