diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php index 550a3c8471..bbeceae211 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -338,11 +338,11 @@ public function wasDefaultRevision() { /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */ $entity_type = $this->getEntityType(); if (!$entity_type->isRevisionable()) { - throw new \LogicException("Entity type {$this->getEntityTypeId()} does not support revisions."); + return TRUE; } - $revision_default_key = $entity_type->getKey('revision_default'); - $value = $this->isNew() ? $this->isDefaultRevision() : $this->get($revision_default_key)->value; + $revision_default_key = $entity_type->getRevisionMetadataKey('revision_default'); + $value = $this->isNew() || $this->get($revision_default_key)->value; if (isset($value)) { return (bool) $value; diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php index 0599392e5c..cef3742ac1 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php @@ -378,7 +378,7 @@ protected function doSave($id, EntityInterface $entity) { // Populate the "revision_default" flag. if ($this->entityType->isRevisionable()) { - $revision_default_key = $this->entityType->getKey('revision_default'); + $revision_default_key = $this->entityType->getRevisionMetadataKey('revision_default'); $entity->set($revision_default_key, $entity->isDefaultRevision()); } diff --git a/core/lib/Drupal/Core/Entity/ContentEntityType.php b/core/lib/Drupal/Core/Entity/ContentEntityType.php index 0e26c3bb51..5be34c9ba5 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityType.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php @@ -19,10 +19,15 @@ class ContentEntityType extends EntityType implements ContentEntityTypeInterface */ public function __construct($definition) { parent::__construct($definition); + $this->handlers += [ 'storage' => 'Drupal\Core\Entity\Sql\SqlContentEntityStorage', 'view_builder' => 'Drupal\Core\Entity\EntityViewBuilder', ]; + + $this->revision_metadata_keys += [ + 'revision_default' => 'revision_default', + ]; } /** diff --git a/core/lib/Drupal/Core/Entity/EntityFieldManager.php b/core/lib/Drupal/Core/Entity/EntityFieldManager.php index d2a3fbfc32..0c699b0332 100644 --- a/core/lib/Drupal/Core/Entity/EntityFieldManager.php +++ b/core/lib/Drupal/Core/Entity/EntityFieldManager.php @@ -190,6 +190,7 @@ public function getBaseFieldDefinitions($entity_type_id) { * flagged as translatable. */ protected function buildBaseFieldDefinitions($entity_type_id) { + /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */ $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); $class = $entity_type->getClass(); /** @var string[] $keys */ @@ -221,16 +222,18 @@ protected function buildBaseFieldDefinitions($entity_type_id) { } } - // Make sure revisionable entity types are correctly defined. + // Make sure that revisionable entity types are correctly defined. if ($entity_type->isRevisionable()) { - $base_field_definitions[$keys['revision_default']] = BaseFieldDefinition::create('boolean') + $field_name = $entity_type->getRevisionMetadataKey('revision_default'); + $base_field_definitions[$field_name] = BaseFieldDefinition::create('boolean') ->setLabel($this->t('Default revision')) ->setDescription($this->t('A flag indicating whether this was a default revision when it was saved.')) ->setTranslatable(FALSE) ->setRevisionable(TRUE); } - // Make sure that revisionable entity types are correctly defined. + // Make sure that revisionable and translatable entity types are correctly + // defined. if ($entity_type->isRevisionable() && $entity_type->isTranslatable()) { // The 'revision_translation_affected' field should always be defined. // This field has been added unconditionally in Drupal 8.4.0 and it is diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php index 719367eefb..19a52ca0fa 100644 --- a/core/lib/Drupal/Core/Entity/EntityType.php +++ b/core/lib/Drupal/Core/Entity/EntityType.php @@ -302,7 +302,6 @@ public function __construct($definition) { 'bundle' => '', 'langcode' => '', 'default_langcode' => 'default_langcode', - 'revision_default' => 'revision_default', 'revision_translation_affected' => 'revision_translation_affected', ]; $this->handlers += [ diff --git a/core/lib/Drupal/Core/Entity/RevisionableInterface.php b/core/lib/Drupal/Core/Entity/RevisionableInterface.php index 6d07f5e2ad..5987580319 100644 --- a/core/lib/Drupal/Core/Entity/RevisionableInterface.php +++ b/core/lib/Drupal/Core/Entity/RevisionableInterface.php @@ -58,8 +58,7 @@ public function isDefaultRevision($new_value = NULL); * TRUE if the entity object was a revision, FALSE otherwise. * * @throws \LogicException - * If the entity type is not revisionable or the default revision data is - * missing. + * If the default revision data is missing. */ public function wasDefaultRevision(); diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php index 4102d95870..29b8a9aa95 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php @@ -330,14 +330,7 @@ public function getTableMapping(array $storage_definitions = NULL) { // If the entity is revisionable, gather the fields that need to be put // in the revision table. $revisionable = $this->entityType->isRevisionable(); - $revision_metadata_fields = []; - if ($revisionable) { - $revision_metadata_fields = array_values($this->entityType->getRevisionMetadataKeys()); - $revision_default_key = $this->entityType->getKey('revision_default'); - if ($revision_default_key) { - array_unshift($revision_metadata_fields, $revision_default_key); - } - } + $revision_metadata_fields = $revisionable ? array_values($this->entityType->getRevisionMetadataKeys()) : []; $translatable = $this->entityType->isTranslatable(); if (!$revisionable && !$translatable) { diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php index 77408ce8e5..db46d05999 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php @@ -245,7 +245,7 @@ protected function copyData(array &$sandbox) { $original_base_table = $original_entity_type->getBaseTable(); $revision_id_key = $temporary_entity_type->getKey('revision'); - $revision_default_affected_key = $temporary_entity_type->getKey('revision_default'); + $revision_default_key = $temporary_entity_type->getRevisionMetadataKey('revision_default'); $revision_translation_affected_key = $temporary_entity_type->getKey('revision_translation_affected'); // If 'progress' is not set, then this will be the first run of the batch. @@ -291,7 +291,7 @@ protected function copyData(array &$sandbox) { // We had no revisions so far, so the existing data belongs to the // default revision now. - $entity->set($revision_default_affected_key, TRUE); + $entity->set($revision_default_key, TRUE); // Set the 'revision_translation_affected' flag to TRUE to match the // previous API return value: if the field was not defined the value @@ -386,7 +386,7 @@ protected function updateFieldStorageDefinitionsToRevisionable(ContentEntityType $updated_storage_definitions[$entity_type->getKey('revision')] = $revision_field; // Add the default revision flag field. - $field_name = $entity_type->getKey('revision_default'); + $field_name = $entity_type->getRevisionMetadataKey('revision_default'); $storage_definition = BaseFieldDefinition::create('boolean') ->setName($field_name) ->setTargetEntityTypeId($entity_type->id()) diff --git a/core/modules/system/system.install b/core/modules/system/system.install index 4471303132..3f59d9e8c1 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -2078,7 +2078,7 @@ function system_update_8501() { // Install the 'revision_default' field. foreach ($definitions as $entity_type_id => $entity_type) { - $field_name = $entity_type->getKey('revision_default'); + $field_name = $entity_type->getRevisionMetadataKey('revision_default'); // Install the 'revision_translation_affected' field if needed. if (!$definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id)) { // Make sure the new "revision_default" entity key is available also to diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php index 285cdda3ae..5c97afad6d 100644 --- a/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php @@ -60,7 +60,6 @@ public function testGetKeys($entity_keys, $expected) { $entity_type = $this->setUpEntityType(['entity_keys' => $entity_keys]); $expected += [ 'default_langcode' => 'default_langcode', - 'revision_default' => 'revision_default', 'revision_translation_affected' => 'revision_translation_affected', ]; $this->assertSame($expected, $entity_type->getKeys()); diff --git a/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php index 90a14bbb60..bf3fd46eb6 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php @@ -777,7 +777,6 @@ public function testGetTableMappingRevisionableTranslatable(array $entity_keys) 'bundle' => $entity_keys['bundle'], 'uuid' => $entity_keys['uuid'], 'langcode' => 'langcode', - 'revision_default' => 'revision_default', ]; $revision_metadata_keys = [ 'revision_created' => 'revision_timestamp', @@ -802,7 +801,6 @@ public function testGetTableMappingRevisionableTranslatable(array $entity_keys) ['bundle', $entity_keys['bundle']], ['revision', $entity_keys['revision']], ['langcode', $entity_keys['langcode']], - ['revision_default', $entity_keys['revision_default']], ])); $this->entityType->expects($this->any()) ->method('getRevisionMetadataKeys') @@ -836,7 +834,6 @@ public function testGetTableMappingRevisionableTranslatable(array $entity_keys) $entity_keys['id'], $entity_keys['revision'], $entity_keys['langcode'], - $entity_keys['revision_default'], ])); $expected = array_merge($expected, array_values($revision_metadata_keys)); $actual = $mapping->getFieldNames('entity_test_revision'); @@ -889,7 +886,6 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent 'bundle' => $entity_keys['bundle'], 'uuid' => $entity_keys['uuid'], 'langcode' => 'langcode', - 'revision_default' => 'revision_default', ]; // PHPUnit does not allow for multiple data providers. @@ -930,7 +926,6 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent ['bundle', $entity_keys['bundle']], ['revision', $entity_keys['revision']], ['langcode', $entity_keys['langcode']], - ['revision_default', $entity_keys['revision_default']], ])); $this->entityType->expects($this->any()) ->method('getRevisionMetadataKeys') @@ -972,7 +967,6 @@ public function testGetTableMappingRevisionableTranslatableWithFields(array $ent $entity_keys['id'], $entity_keys['revision'], $entity_keys['langcode'], - $entity_keys['revision_default'], ]), array_values($revision_metadata_field_names)); $actual = $mapping->getFieldNames('entity_test_revision'); $this->assertEquals($expected, $actual);