diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php index 5b821c8de0..12b9324402 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -338,7 +338,11 @@ public function wasDefaultRevision() { if (!$this->getEntityType()->isRevisionable()) { throw new \LogicException("Entity type {$this->getEntityTypeId()} does not support revisions."); } - return (bool) $this->get('default_revision')->value; + $value = $this->get('default_revision')->value; + if (isset($value)) { + return (bool) $value; + } + throw new \LogicException("Missing data for the \"default_revision\" field on the entity {$this->getEntityTypeId()}:{$this->id()}."); } /** @@ -1303,8 +1307,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->setLabel(new TranslatableMarkup('Default revision')) ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.')) ->setTranslatable(FALSE) - ->setRevisionable(TRUE) - ->setRequired(TRUE); + ->setRevisionable(TRUE); } if ($entity_type->hasKey('langcode')) { diff --git a/core/lib/Drupal/Core/Entity/EntityFieldManager.php b/core/lib/Drupal/Core/Entity/EntityFieldManager.php index 040a34c681..63c35e9743 100644 --- a/core/lib/Drupal/Core/Entity/EntityFieldManager.php +++ b/core/lib/Drupal/Core/Entity/EntityFieldManager.php @@ -220,8 +220,7 @@ protected function buildBaseFieldDefinitions($entity_type_id) { } } - // Make sure that revisionable and translatable entity types are correctly - // defined. + // 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. // This field has been added unconditionally in Drupal 8.4.0 and it is diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php index fb497523bd..3b15161380 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchemaConverter.php @@ -384,18 +384,19 @@ protected function updateFieldStorageDefinitionsToRevisionable(ContentEntityType } $updated_storage_definitions[$entity_type->getKey('revision')] = $revision_field; - $revision_type_field = BaseFieldDefinition::create('boolean') - ->setName('default_revision') + // Add the default revision flag. + $field_name = 'default_revision'; + $default_revision_field = BaseFieldDefinition::create('boolean') + ->setName($field_name) ->setLabel(new TranslatableMarkup('Default revision')) ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.')) ->setTranslatable(FALSE) - ->setRevisionable(TRUE) - ->setRequired(TRUE); + ->setRevisionable(TRUE); if ($update_cached_definitions) { - $this->entityDefinitionUpdateManager->installFieldStorageDefinition($revision_type_field->getName(), $entity_type->id(), $entity_type->getProvider(), $revision_type_field); + $this->entityDefinitionUpdateManager->installFieldStorageDefinition($default_revision_field->getName(), $entity_type->id(), $entity_type->getProvider(), $default_revision_field); } - $updated_storage_definitions[$revision_type_field->getName()] = $revision_type_field; + $updated_storage_definitions[$default_revision_field->getName()] = $default_revision_field; // Add the 'revision_translation_affected' field if needed. if ($entity_type->isTranslatable()) { diff --git a/core/modules/system/system.install b/core/modules/system/system.install index 2f59ad4255..38c63517f7 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -2061,32 +2061,34 @@ function system_update_8403() { * Add the 'revision_type' field to all entity types. */ function system_update_8501() { + /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */ + $field_manager = \Drupal::service('entity_field.manager'); $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); - // Get a list of revisionable entity types. + // Get a list of entity types to process. /** @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(); + $definitions = array_filter(\Drupal::entityTypeManager()->getDefinitions(), function (EntityTypeInterface $entity_type) use ($field_manager, $definition_update_manager) { + $entity_type_id = $entity_type->id(); + if ($entity_type = $definition_update_manager->getEntityType($entity_type_id)) { + $field_name = 'default_revision'; + return $entity_type->isRevisionable() + && isset($field_manager->getFieldStorageDefinitions($entity_type_id)[$field_name]) + && !$definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id); } return FALSE; }); + $storage_definition = BaseFieldDefinition::create('boolean') + ->setLabel(t('Default revision')) + ->setDescription(t('A flag indicating whether this was a default revision when it was saved.')) + ->setTranslatable(FALSE) + ->setRevisionable(TRUE) + ->setInitialValue(TRUE); + + // Install the 'default_revision' field. foreach ($definitions as $entity_type_id => $entity_type) { $field_name = 'default_revision'; - - // Install the 'default_revision' field if needed. - if (!$definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id)) { - $storage_definition = BaseFieldDefinition::create('boolean') - ->setLabel(t('Default revision')) - ->setDescription(t('A flag indicating whether this was a default revision when it was saved.')) - ->setTranslatable(FALSE) - ->setRevisionable(TRUE) - ->setRequired(TRUE) - ->setInitialValue(TRUE); - - $definition_update_manager - ->installFieldStorageDefinition($field_name, $entity_type_id, $entity_type_id, $storage_definition); - } + $definition_update_manager + ->installFieldStorageDefinition($field_name, $entity_type_id, $entity_type_id, $storage_definition); } } diff --git a/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php b/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php index 286e8e62bd..175bc7ad80 100644 --- a/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php +++ b/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php @@ -69,11 +69,17 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->setDescription(new TranslatableMarkup('The bundle of the test entity.')) ->setRequired(TRUE); - if ($entity_type->hasKey('revision')) { + if ($entity_type->isRevisionable()) { $fields[$entity_type->getKey('revision')] = BaseFieldDefinition::create('integer') ->setLabel(new TranslatableMarkup('Revision ID')) ->setReadOnly(TRUE) ->setSetting('unsigned', TRUE); + + $fields['default_revision'] = BaseFieldDefinition::create('boolean') + ->setLabel(new TranslatableMarkup('Default revision')) + ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.')) + ->setTranslatable(FALSE) + ->setRevisionable(TRUE); } $fields[$entity_type->getKey('langcode')] = BaseFieldDefinition::create('language')