You are here

function entity_reference_revisions_entity_revision_create in Entity Reference Revisions 8

Implements hook_entity_revision_create().

File

./entity_reference_revisions.module, line 230
Provides a field that can reference other entities.

Code

function entity_reference_revisions_entity_revision_create(ContentEntityInterface $new_revision, ContentEntityInterface $entity, $keep_untranslatable_fields) {
  $entity_type_manager = \Drupal::entityTypeManager();
  $storage = \Drupal::entityTypeManager()
    ->getStorage($entity
    ->getEntityTypeId());
  foreach ($entity
    ->getFieldDefinitions() as $field_name => $field_definition) {
    if ($field_definition
      ->getType() == 'entity_reference_revisions' && !$field_definition
      ->isTranslatable()) {
      $target_entity_type_id = $field_definition
        ->getSetting('target_type');
      if ($entity_type_manager
        ->getDefinition($target_entity_type_id)
        ->get('entity_revision_parent_id_field')) {

        // The default implementation copied the values from the current
        // default revision into the field since it is not translatable.
        // Take the originally referenced entity, create a new revision
        // of it and set that instead on the new entity revision.
        $active_langcode = $entity
          ->language()
          ->getId();
        $target_storage = \Drupal::entityTypeManager()
          ->getStorage($target_entity_type_id);
        if ($target_storage instanceof TranslatableRevisionableStorageInterface) {
          $items = $entity
            ->get($field_name);
          $translation_items = NULL;
          if (!$new_revision
            ->isDefaultTranslation() && $storage instanceof TranslatableRevisionableStorageInterface) {
            $translation_items = $items;
            $items = $storage
              ->load($new_revision
              ->id())
              ->get($field_name);
          }
          $values = [];
          foreach ($items as $delta => $item) {

            // If the target entity is missing, let's skip it.
            if (empty($item->entity)) {
              continue;
            }

            // Use the item from the translation if it exists.
            // If we have translation items, use that if one with the matching
            // target id exists.
            if ($translation_items) {
              foreach ($translation_items as $translation_item) {
                if ($item->target_id == $translation_item->target_id) {
                  $item = $translation_item;
                  break;
                }
              }
            }

            /** @var \Drupal\Core\Entity\ContentEntityInterface $target_entity */
            $target_entity = $item->entity;
            if (!$target_entity
              ->hasTranslation($active_langcode)) {
              $target_entity
                ->addTranslation($active_langcode, $target_entity
                ->toArray());
            }
            $target_entity = $item->entity
              ->getTranslation($active_langcode);
            $revised_entity = $target_storage
              ->createRevision($target_entity, $new_revision
              ->isDefaultRevision(), $keep_untranslatable_fields);

            // Restore the revision ID.
            $revision_key = $revised_entity
              ->getEntityType()
              ->getKey('revision');
            $revised_entity
              ->set($revision_key, $revised_entity
              ->getLoadedRevisionId());
            $values[$delta] = $revised_entity;
          }
          $new_revision
            ->set($field_name, $values);
        }
      }
    }
  }
}