diff --git a/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php b/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php index 31eb813..166c0ba 100644 --- a/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php +++ b/core/lib/Drupal/Core/Field/DeletedFieldsRepository.php @@ -3,7 +3,6 @@ namespace Drupal\Core\Field; use Drupal\Core\State\StateInterface; -use Drupal\field\Entity\FieldConfig; /** * Provides a repository for deleted field and field storage objects. @@ -30,40 +29,13 @@ public function __construct(StateInterface $state) { /** * {@inheritdoc} */ - public function getFields() { - $fields = $this->state->get('field.field.deleted', []); - - $deleted_storages = $this->getFieldStorages(); - /** @var \Drupal\Core\Field\FieldDefinitionInterface $field */ - foreach ($fields as $id => $field) { - // Configurable fields have an internal reference to their field storage - // which we must keep in sync if the storage itself is also deleted. - if ($field instanceof FieldConfigInterface && isset($deleted_storages[$field->field_storage_unique_id])) { - $config = $field->toArray(); - $config['deleted'] = TRUE; - $config['field_storage'] = $deleted_storages[$field->field_storage_unique_id]; - $updated_field = FieldConfig::create($config); - - // Re-assign the 'field_storage_unique_id' property since it was lost - // above while re-initializing the configurable field object. - $updated_field->field_storage_unique_id = $field->field_storage_unique_id; - - $fields[$id] = $updated_field; - } - } - - return $fields; - } + public function getFields($field_storage_unique_id = NULL) { + $deleted_fields = $this->state->get('field.field.deleted', []); - /** - * {@inheritdoc} - */ - public function getFieldsByFieldStorageId($field_storage_unique_id) { - $deleted_fields = []; - foreach ($this->getFields() as $id => $field) { - if ($field->field_storage_unique_id === $field_storage_unique_id) { - $deleted_fields[$field->getUniqueIdentifier()] = $field; - } + if ($field_storage_unique_id) { + $deleted_fields = array_filter($this->getFields(), function (FieldDefinitionInterface $field) use ($field_storage_unique_id) { + return $field->getFieldStorageDefinition()->getUniqueStorageIdentifier() === $field_storage_unique_id; + }); } return $deleted_fields; @@ -82,10 +54,6 @@ public function getFieldStorages() { public function addField(FieldDefinitionInterface $field) { $deleted_fields = $this->state->get('field.field.deleted', []); - // Add a helper property that allows us to filter by the field storage - // unique identifier in getFieldsByFieldStorageId(). - $field->field_storage_unique_id = $field->getFieldStorageDefinition()->getUniqueStorageIdentifier(); - $deleted_fields[$field->getUniqueIdentifier()] = $field; $this->state->set('field.field.deleted', $deleted_fields); diff --git a/core/lib/Drupal/Core/Field/DeletedFieldsRepositoryInterface.php b/core/lib/Drupal/Core/Field/DeletedFieldsRepositoryInterface.php index f55bab7..dcbef1c 100644 --- a/core/lib/Drupal/Core/Field/DeletedFieldsRepositoryInterface.php +++ b/core/lib/Drupal/Core/Field/DeletedFieldsRepositoryInterface.php @@ -10,18 +10,14 @@ /** * Returns a list of deleted field definitions. * - * @return \Drupal\Core\Field\FieldDefinitionInterface[] - * An array of field definition objects, keyed by their unique identifier. - */ - public function getFields(); - - /** - * Returns a list of deleted fields definitions filtered by a storage ID. + * @param string $field_storage_unique_id + * (optional) A unique ID of field storage definition for filtering the + * deleted fields. Defaults to NULL. * * @return \Drupal\Core\Field\FieldDefinitionInterface[] * An array of field definition objects, keyed by their unique identifier. */ - public function getFieldsByFieldStorageId($field_storage_unique_id); + public function getFields($field_storage_unique_id = NULL); /** * Returns a list of deleted field storage definitions. diff --git a/core/modules/field/field.purge.inc b/core/modules/field/field.purge.inc index 06b45f2..87b9479 100644 --- a/core/modules/field/field.purge.inc +++ b/core/modules/field/field.purge.inc @@ -75,12 +75,7 @@ function field_purge_batch($batch_size, $field_storage_unique_id = NULL) { /** @var \Drupal\Core\Field\DeletedFieldsRepositoryInterface $deleted_fields_repository */ $deleted_fields_repository = \Drupal::service('field.deleted_fields_repository'); - if (!$field_storage_unique_id) { - $fields = $deleted_fields_repository->getFields(); - } - else { - $fields = $deleted_fields_repository->getFieldsByFieldStorageId($field_storage_unique_id); - } + $fields = $deleted_fields_repository->getFields($field_storage_unique_id); $info = \Drupal::entityManager()->getDefinitions(); foreach ($fields as $field) { @@ -119,7 +114,7 @@ function field_purge_batch($batch_size, $field_storage_unique_id = NULL) { continue; } - $fields = $deleted_fields_repository->getFieldsByFieldStorageId($field_storage->getUniqueStorageIdentifier()); + $fields = $deleted_fields_repository->getFields($field_storage->getUniqueStorageIdentifier()); if (empty($fields)) { field_purge_field_storage($field_storage); } @@ -159,7 +154,7 @@ function field_purge_field_storage(FieldStorageDefinitionInterface $field_storag /** @var \Drupal\Core\Field\DeletedFieldsRepositoryInterface $deleted_fields_repository */ $deleted_fields_repository = \Drupal::service('field.deleted_fields_repository'); - $fields = $deleted_fields_repository->getFieldsByFieldStorageId($field_storage->getUniqueStorageIdentifier()); + $fields = $deleted_fields_repository->getFields($field_storage->getUniqueStorageIdentifier()); if (count($fields) > 0) { throw new FieldException(t('Attempt to purge a field storage @field_name that still has fields.', ['@field_name' => $field_storage->getName()])); } diff --git a/core/modules/field/src/Entity/FieldStorageConfig.php b/core/modules/field/src/Entity/FieldStorageConfig.php index 4cf7488..be5bbab 100644 --- a/core/modules/field/src/Entity/FieldStorageConfig.php +++ b/core/modules/field/src/Entity/FieldStorageConfig.php @@ -419,6 +419,18 @@ public static function preDelete(EntityStorageInterface $storage, array $field_s $storage = clone $field_storage; $storage->deleted = TRUE; $deleted_fields_repository->addFieldStorage($storage); + + // We also need to update the definitions of all the deleted fields that + // were using this field storage. + $deleted_fields = $deleted_fields_repository->getFields($storage->getUniqueStorageIdentifier()); + foreach ($deleted_fields as $deleted_field) { + $config = $deleted_field->toArray(); + $config['deleted'] = TRUE; + $config['field_storage'] = $storage; + $updated_field = FieldConfig::create($config); + + $deleted_fields_repository->addField($updated_field); + } } } } diff --git a/core/modules/field/tests/src/Kernel/BulkDeleteTest.php b/core/modules/field/tests/src/Kernel/BulkDeleteTest.php index 900c154..3a3cb02 100644 --- a/core/modules/field/tests/src/Kernel/BulkDeleteTest.php +++ b/core/modules/field/tests/src/Kernel/BulkDeleteTest.php @@ -10,6 +10,7 @@ * Bulk delete storages and fields, and clean up afterwards. * * @group field + * @group failing */ class BulkDeleteTest extends FieldKernelTestBase { diff --git a/core/modules/field/tests/src/Kernel/FieldCrudTest.php b/core/modules/field/tests/src/Kernel/FieldCrudTest.php index 6407be7..ebac759 100644 --- a/core/modules/field/tests/src/Kernel/FieldCrudTest.php +++ b/core/modules/field/tests/src/Kernel/FieldCrudTest.php @@ -15,6 +15,7 @@ * @coversDefaultClass \Drupal\Core\Field\FieldConfigBase * * @group field + * @group failing */ class FieldCrudTest extends FieldKernelTestBase { diff --git a/core/modules/field/tests/src/Kernel/FieldImportDeleteUninstallTest.php b/core/modules/field/tests/src/Kernel/FieldImportDeleteUninstallTest.php index c3a4d3c..756b031 100644 --- a/core/modules/field/tests/src/Kernel/FieldImportDeleteUninstallTest.php +++ b/core/modules/field/tests/src/Kernel/FieldImportDeleteUninstallTest.php @@ -11,6 +11,7 @@ * module that provides the field type. * * @group field + * @group failing * @see \Drupal\field\ConfigImporterFieldPurger * @see field_config_import_steps_alter() */ diff --git a/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php b/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php index dfc50f2..9af9a62 100644 --- a/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php +++ b/core/modules/field/tests/src/Kernel/FieldStorageCrudTest.php @@ -13,6 +13,7 @@ * Tests field storage create, read, update, and delete. * * @group field + * @group failing */ class FieldStorageCrudTest extends FieldKernelTestBase {