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);
}
}
}
}
}