diff --git a/paragraphs.module b/paragraphs.module index ea9f1d1..ca656e0 100644 --- a/paragraphs.module +++ b/paragraphs.module @@ -210,3 +210,41 @@ function template_preprocess_paragraph(&$variables) { $variables['content'][$key] = $variables['elements'][$key]; } } + +/** + * Implements hook_entity_type_alter(). + * + * @param \Drupal\Core\Entity\EntityTypeInterface[] $entity_types + */ +function multiversion_entity_type_alter(array &$entity_types) { + /** @var \Drupal\multiversion\MultiversionManagerInterface $manager */ + $manager = \Drupal::service('multiversion.manager'); + + foreach ($entity_types as $entity_type) { + if ($manager->isEnabledEntityType($entity_type)) { + // Make all content entity types revisionable. + if (!$entity_type->isRevisionable()) { + // We only need to set the revision key to make an entity type + // revisionable. The table names will be handled by the storage class. + // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout + $keys = $entity_type->getKeys(); + $keys['revision'] = 'revision_id'; + $entity_type->set('entity_keys', $keys); + if ($entity_type->getRevisionTable() === null) { + $entity_type->set('revision_table', $entity_type->id() . '_revision'); + } + if ($entity_type->getRevisionDataTable() === null) { + $entity_type->set('revision_data_table', $entity_type->id() . '_field_revision'); + } + } + + $namespace = 'Drupal\multiversion\Entity\Storage\Sql'; + switch ($entity_type->id()) { + case 'paragraph': + $entity_type->setHandlerClass('storage', "$namespace\\ParagraphsStorage"); + $entity_type->setHandlerClass('storage_schema', "$namespace\\ParagraphsStorageSchema"); + break; + } + } + } +} diff --git a/src/Entity/Storage/Sql/ParagraphsStorage.php b/src/Entity/Storage/Sql/ParagraphsStorage.php new file mode 100644 index 0000000..80235d1 --- /dev/null +++ b/src/Entity/Storage/Sql/ParagraphsStorage.php @@ -0,0 +1,71 @@ +saveEntity($entity); + $this->updateRevIds($entity); + + return $result; + } + + /** + * Assign the revision ID to the value the parent entity uses. + */ + private function updateRevIds($entity) { + // Test if entity has parent. + if ($parent_entity = $entity->getParentEntity()){ + $parent_entity_id = $parent_entity->id(); + $parent_entity_rev_id = $parent_entity->getRevisionId(); + $parent_entity_type = $parent_entity->getEntityTypeId(); + $parent_entity_field_name = $entity->parent_field_name->value; + + $entity_id = $entity->id(); + $entity_rev_id = $entity->getRevisionId(); + + if (empty($parent_entity_id) + || empty($parent_entity_type) + || empty($parent_entity_field_name) + || empty($entity_id) + || empty($entity_rev_id)) { + return NULL; + } + + // Set newest revision ID in parent field table. + $db = \Drupal::database(); + + // Address normal and revision tables. + foreach (['', '_revision'] as $table) { + $query = $db + ->update($parent_entity_type . $table . '__' . $parent_entity_field_name) + ->fields(["{$parent_entity_field_name}_target_revision_id" => $entity_rev_id]) + ->condition("{$parent_entity_field_name}_target_id", $entity_id); + + if ($table === '_revision') { + $query + ->condition('entity_id', $parent_entity_id) + ->condition('revision_id', $parent_entity_rev_id); + } + + $query->execute(); + } + + \Drupal::service('cache_tags.invalidator')->invalidateTags((array) $parent_entity->getCacheTagsToInvalidate()); + } + } + +} diff --git a/src/Entity/Storage/Sql/ParagraphsStorageSchema.php b/src/Entity/Storage/Sql/ParagraphsStorageSchema.php new file mode 100644 index 0000000..e275f6a --- /dev/null +++ b/src/Entity/Storage/Sql/ParagraphsStorageSchema.php @@ -0,0 +1,15 @@ +