From cb27f971633297921a904ab53a63ea6c8c492736 Mon Sep 17 00:00:00 2001 From: damienmckenna Date: Mon, 5 Dec 2016 15:30:02 +0100 Subject: [PATCH] Issue #2674882 by DamienMcKenna, miro_dietiker, greggmarshall, Grimreaper: Add Multiversion compatibility to Entity Reference Revisions (for Paragraphs, etc) --- entity_reference_revisions.module | 11 ++++ src/EntityReferenceRevisionsMultiversionItem.php | 68 ++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/EntityReferenceRevisionsMultiversionItem.php diff --git a/entity_reference_revisions.module b/entity_reference_revisions.module index ba9ac49..b7b258f 100644 --- a/entity_reference_revisions.module +++ b/entity_reference_revisions.module @@ -218,3 +218,14 @@ function entity_reference_revisions_form_field_ui_field_storage_add_form_alter(a unset($form['add']['new_storage_type']['#options'][(string) t('Reference revisions')]['entity_reference_revisions']); $form['add']['new_storage_type']['#options'][(string) t('Reference revisions')]['entity_reference_revisions'] = t('Other…'); } + +/** + * Implements hook_field_info_alter(). + */ +function entity_reference_revisions_field_info_alter(&$info) { + if (\Drupal::moduleHandler()->moduleExists('multiversion')) { + if (isset($info['entity_reference_revisions'])) { + $info['entity_reference_revisions']['class'] = '\Drupal\entity_reference_revisions\EntityReferenceRevisionsMultiversionItem'; + } + } +} diff --git a/src/EntityReferenceRevisionsMultiversionItem.php b/src/EntityReferenceRevisionsMultiversionItem.php new file mode 100644 index 0000000..32f8124 --- /dev/null +++ b/src/EntityReferenceRevisionsMultiversionItem.php @@ -0,0 +1,68 @@ +hasNewEntity()) { + // As part of a bulk or replication operation there might be multiple + // parent entities wanting to auto-create the same reference. So at this + // point this entity might already be saved, so look it up by UUID and map + // it correctly. + // @see \Drupal\relaxed\BulkDocs\BulkDocs::save() + if ($this->entity->isNew()) { + $uuid = $this->entity->uuid(); + $uuid_index = \Drupal::service('multiversion.entity_index.factory') + ->get('multiversion.entity_index.uuid'); + if ($uuid && $record = $uuid_index->get($uuid)) { + /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ + $entity_type_manager = \Drupal::service('entity_type.manager'); + $entity_type_id = $this->entity->getEntityTypeId(); + + // Now decide what revision to use. + $id_key = $entity_type_manager + ->getDefinition($entity_type_id) + ->getKey('id'); + $revision_key = $entity_type_manager + ->getDefinition($entity_type_id) + ->getKey('revision'); + + // If the referenced entity is a stub, but an entity already was + // created, then load and use that entity instead without saving. + if ($this->entity->_rev->is_stub && is_numeric($record['entity_id'])) { + $this->entity = $entity_type_manager + ->getStorage($entity_type_id) + ->loadRevision($record['revision_id']); + } + // If the referenced entity is not a stub then map it with the correct + // ID from the existing record and save it. + elseif (!$this->entity->_rev->is_stub) { + $this->entity->{$id_key}->value = $record['entity_id']; + $this->entity->{$revision_key}->value = $record['revision_id']; + $this->entity->enforceIsNew(FALSE); + $this->entity->save(); + } + } + // Just save the entity if no previous record exists. + else { + $this->entity->save(); + } + } + } + + parent::preSave(); + } + +} -- 1.9.1