diff --git a/core/lib/Drupal/Core/Entity/EditorialContentEntityBase.php b/core/lib/Drupal/Core/Entity/EditorialContentEntityBase.php index ff6abcd..85e2e6b 100644 --- a/core/lib/Drupal/Core/Entity/EditorialContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/EditorialContentEntityBase.php @@ -2,6 +2,8 @@ namespace Drupal\Core\Entity; +use Drupal\Core\Field\BaseFieldDefinition; + /** * Provides a base entity class with extended revision and publishing support. * diff --git a/core/lib/Drupal/Core/Entity/EntityFieldManager.php b/core/lib/Drupal/Core/Entity/EntityFieldManager.php index 378a95c..8582294 100644 --- a/core/lib/Drupal/Core/Entity/EntityFieldManager.php +++ b/core/lib/Drupal/Core/Entity/EntityFieldManager.php @@ -220,6 +220,19 @@ protected function buildBaseFieldDefinitions($entity_type_id) { } } + // Make sure that revisionable entity types are correctly defined. + if ($entity_type->isRevisionable() && $entity_type->isTranslatable()) { + // The 'revision_translation_affected' field should always be defined. + if (!isset($base_field_definitions['revision_translation_affected'])) { + $base_field_definitions['revision_translation_affected'] = BaseFieldDefinition::create('boolean') + ->setLabel($this->t('Revision translation affected')) + ->setDescription($this->t('Indicates if the last edit of a translation belongs to current revision.')) + ->setReadOnly(TRUE) + ->setRevisionable(TRUE) + ->setTranslatable(TRUE); + } + } + // Assign base field definitions the entity type provider. $provider = $entity_type->getProvider(); foreach ($base_field_definitions as $definition) { diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php index 30befd2..92586b9 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php @@ -370,9 +370,26 @@ protected function updateFieldStorageDefinitionsToRevisionable(ContentEntityType if ($update_cached_definitions) { $this->entityDefinitionUpdateManager->installFieldStorageDefinition($revision_field->getName(), $entity_type->id(), $entity_type->getProvider(), $revision_field); } - $updated_storage_definitions[$entity_type->getKey('revision')] = $revision_field; + // Add the 'revision_translation_affected' field if needed. + if ($entity_type->isTranslatable()) { + $revision_translation_affected_field = BaseFieldDefinition::create('boolean') + ->setName('revision_translation_affected') + ->setTargetEntityTypeId($entity_type->id()) + ->setTargetBundle(NULL) + ->setLabel(new TranslatableMarkup('Revision translation affected')) + ->setDescription(new TranslatableMarkup('Indicates if the last edit of a translation belongs to current revision.')) + ->setReadOnly(TRUE) + ->setRevisionable(TRUE) + ->setTranslatable(TRUE); + + if ($update_cached_definitions) { + $this->entityDefinitionUpdateManager->installFieldStorageDefinition($revision_translation_affected_field->getName(), $entity_type->id(), $entity_type->getProvider(), $revision_translation_affected_field); + $updated_storage_definitions['revision_translation_affected'] = $revision_translation_affected_field; + } + } + return $updated_storage_definitions; } diff --git a/core/modules/block_content/src/Entity/BlockContent.php b/core/modules/block_content/src/Entity/BlockContent.php index 76071df..66a7a8f 100644 --- a/core/modules/block_content/src/Entity/BlockContent.php +++ b/core/modules/block_content/src/Entity/BlockContent.php @@ -216,13 +216,6 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->setSetting('target_type', 'user') ->setRevisionable(TRUE); - $fields['revision_translation_affected'] = BaseFieldDefinition::create('boolean') - ->setLabel(t('Revision translation affected')) - ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.')) - ->setReadOnly(TRUE) - ->setRevisionable(TRUE) - ->setTranslatable(TRUE); - return $fields; } diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php index e5544a2..368ce1b 100644 --- a/core/modules/node/src/Entity/Node.php +++ b/core/modules/node/src/Entity/Node.php @@ -400,13 +400,6 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ]) ->setDisplayConfigurable('form', TRUE); - $fields['revision_translation_affected'] = BaseFieldDefinition::create('boolean') - ->setLabel(t('Revision translation affected')) - ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.')) - ->setReadOnly(TRUE) - ->setRevisionable(TRUE) - ->setTranslatable(TRUE); - return $fields; } diff --git a/core/modules/system/src/Tests/Entity/Update/SqlContentEntityStorageSchemaConverterTest.php b/core/modules/system/src/Tests/Entity/Update/SqlContentEntityStorageSchemaConverterTest.php index 3a0aca2..014f995 100644 --- a/core/modules/system/src/Tests/Entity/Update/SqlContentEntityStorageSchemaConverterTest.php +++ b/core/modules/system/src/Tests/Entity/Update/SqlContentEntityStorageSchemaConverterTest.php @@ -92,6 +92,9 @@ public function testMakeRevisionable() { $entity_test_update = $this->lastInstalledSchemaRepository->getLastInstalledDefinition('entity_test_update'); $this->assertTrue($entity_test_update->isRevisionable()); + $field_storage_definitions = $this->lastInstalledSchemaRepository->getLastInstalledFieldStorageDefinitions('entity_test_update'); + $this->assertTrue(isset($field_storage_definitions['revision_translation_affected'])); + /** @var \Drupal\Core\Entity\Sql\SqlEntityStorageInterface $storage */ $storage = \Drupal::entityTypeManager()->getStorage('entity_test_update'); $this->assertEqual(count($storage->loadMultiple()), 102, 'All test entities were found.'); diff --git a/core/modules/system/src/Tests/Update/EntityUpdateToRevisionableAndPublishableTest.php b/core/modules/system/src/Tests/Update/EntityUpdateToRevisionableAndPublishableTest.php index 167bf12..37fcfb0 100644 --- a/core/modules/system/src/Tests/Update/EntityUpdateToRevisionableAndPublishableTest.php +++ b/core/modules/system/src/Tests/Update/EntityUpdateToRevisionableAndPublishableTest.php @@ -77,6 +77,9 @@ protected function setDatabaseDumpFiles() { /** * Tests the conversion of an entity type to revisionable and publishable. + * + * @covers entity_test_update_update_8400 + * @covers system_update_8402 */ public function testConvertToRevisionableAndPublishable() { // Check that entity type is not revisionable nor publishable prior to @@ -100,6 +103,11 @@ public function testConvertToRevisionableAndPublishable() { $storage = \Drupal::entityTypeManager()->getStorage('entity_test_update'); $this->assertEqual(count($storage->loadMultiple()), 102, 'All test entities were found.'); + // Check that the 'revision_translation_affected' field has been added by + // system_update_8402(). + $field_storage_definitions = $this->lastInstalledSchemaRepository->getLastInstalledFieldStorageDefinitions('entity_test_update'); + $this->assertTrue(isset($field_storage_definitions['revision_translation_affected'])); + // The conversion to revisionable is already tested by // \Drupal\system\Tests\Entity\Update\SqlContentEntityStorageSchemaConverterTest::testMakeRevisionable() // so we only need to check that some special cases are handled. diff --git a/core/modules/system/system.install b/core/modules/system/system.install index a4ffffa..96ede5d 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -17,6 +17,7 @@ use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\Core\DrupalKernel; +use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Site\Settings; use Drupal\Core\StreamWrapper\PrivateStream; use Drupal\Core\StreamWrapper\PublicStream; @@ -1984,3 +1985,34 @@ function system_update_8401() { ->clear('response') ->save(); } + +/** + * Add the 'revision_translation_affected' field to all entity types. + */ +function system_update_8402() { + $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + + // Get a list of revisionable and translatable entity types. + /** @var \Drupal\Core\Entity\ContentEntityTypeInterface[] $definitions */ + $definitions = array_filter(\Drupal::entityTypeManager()->getDefinitions(), function (EntityTypeInterface $entity_type) use ($definition_update_manager) { + if ($entity_type = $definition_update_manager->getEntityType($entity_type->id())) { + return $entity_type->isRevisionable() && $entity_type->isTranslatable(); + } + return FALSE; + }); + + foreach ($definitions as $entity_type_id => $entity_type) { + // Install the 'revision_translation_affected' field if needed. + if (!$definition_update_manager->getFieldStorageDefinition('revision_translation_affected', $entity_type_id)) { + $storage_definition = BaseFieldDefinition::create('boolean') + ->setLabel(t('Revision translation affected')) + ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.')) + ->setReadOnly(TRUE) + ->setRevisionable(TRUE) + ->setTranslatable(TRUE); + + $definition_update_manager + ->installFieldStorageDefinition('revision_translation_affected', $entity_type_id, $entity_type_id, $storage_definition); + } + } +}