diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php index e15363d1dd..316e49d943 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php @@ -479,6 +479,7 @@ protected function getAllRevisionParents(RevisionableInterface $entity) { ->condition($this->idKey, $entity->id(), '=') ->sort($revision_key, 'ASC') ->allRevisions() + ->accessCheck(FALSE) ->execute(); $revision_parents = []; diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/RevisionTreeItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/RevisionTreeItem.php index c32ecf1846..75698b459d 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/RevisionTreeItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/RevisionTreeItem.php @@ -2,7 +2,6 @@ namespace Drupal\Core\Field\Plugin\Field\FieldType; -use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\Core\Field\FieldItemBase; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; @@ -35,26 +34,16 @@ class RevisionTreeItem extends FieldItemBase { public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $target_type = \Drupal::entityTypeManager()->getDefinition($field_definition->getTargetEntityTypeId()); - $target_id_data_type = 'string'; - if ($target_type->entityClassImplements(FieldableEntityInterface::class)) { - $id_definition = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($target_type->id())[$target_type->getKey('revision')]; - if ($id_definition->getType() === 'integer') { - $target_id_data_type = 'integer'; - } - } - - $target_id_definition = DataReferenceTargetDefinition::create($target_id_data_type) - ->setLabel(new TranslatableMarkup('Parent revision ID')); + /** @var \Drupal\Core\Field\BaseFieldDefinition $revision_field_definition */ + $revision_field_definition = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($target_type->id())[$target_type->getKey('revision')]; - $merge_target_id_definition = DataReferenceTargetDefinition::create($target_id_data_type) - ->setLabel(new TranslatableMarkup('Merged revision ID')); + $properties['target_id'] = DataReferenceTargetDefinition::create($revision_field_definition->getDataType()) + ->setLabel(new TranslatableMarkup('Parent revision ID')) + ->setSettings($revision_field_definition->getSettings()); - if ($target_id_data_type === 'integer') { - $target_id_definition->setSetting('unsigned', TRUE); - $merge_target_id_definition->setSetting('unsigned', TRUE); - } - $properties['target_id'] = $target_id_definition; - $properties['merge_target_id'] = $merge_target_id_definition; + $properties['merge_target_id'] = DataReferenceTargetDefinition::create($revision_field_definition->getDataType()) + ->setLabel(new TranslatableMarkup('Merged revision ID')) + ->setSettings($revision_field_definition->getSettings()); return $properties; } @@ -63,39 +52,21 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel * {@inheritdoc} */ public static function schema(FieldStorageDefinitionInterface $field_definition) { - $target_id_property = static::propertyDefinitions($field_definition)['target_id']; + $target_type = \Drupal::entityTypeManager()->getDefinition($field_definition->getTargetEntityTypeId()); - if ($target_id_property->getDataType() === 'integer') { - $columns = [ - 'target_id' => [ - 'description' => 'The ID of the parent revision.', - 'type' => 'int', - 'unsigned' => TRUE, - ], - 'merge_target_id' => [ - 'description' => 'The ID of the merged revision.', - 'type' => 'int', - 'unsigned' => TRUE, - ], - ]; - } - else { - $columns = [ + /** @var \Drupal\Core\Field\BaseFieldDefinition $revision_field_definition */ + $revision_field_definition = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($target_type->id())[$target_type->getKey('revision')]; + $revision_column_schema = $revision_field_definition->getSchema()['columns'][$revision_field_definition->getMainPropertyName()]; + + $schema = [ + 'columns' => [ 'target_id' => [ 'description' => 'The ID of the parent revision.', - 'type' => 'varchar_ascii', - 'length' => 255, - ], + ] + $revision_column_schema, 'merge_target_id' => [ 'description' => 'The ID of the merged revision.', - 'type' => 'varchar_ascii', - 'length' => 255, - ], - ]; - } - - $schema = [ - 'columns' => $columns, + ] + $revision_column_schema, + ], 'indexes' => [ 'target_id' => ['target_id'], ], @@ -108,7 +79,9 @@ public static function schema(FieldStorageDefinitionInterface $field_definition) * {@inheritdoc} */ public function isEmpty() { - // An empty item is always a root. + // The entity storage does not store NULL values for empty field items, but, + // in a tree structure, a node with no parent is a root and the NULL value + // of its parent ID property needs to be stored as such. return FALSE; }