You are here

protected function LayoutBuilderCopyWidget::cloneEntity in Layout Builder Asymmetric Translation 8.2

Replicate an entity.

Parameters

$entity_type_id:

$entity_id:

Return value

\Drupal\Core\Entity\EntityInterface|NULL

1 call to LayoutBuilderCopyWidget::cloneEntity()
LayoutBuilderCopyWidget::extractFormValues in src/Plugin/Field/FieldWidget/LayoutBuilderCopyWidget.php
Extract form values.

File

src/Plugin/Field/FieldWidget/LayoutBuilderCopyWidget.php, line 301

Class

LayoutBuilderCopyWidget
A widget to display the copy widget form.

Namespace

Drupal\layout_builder_at\Plugin\Field\FieldWidget

Code

protected function cloneEntity($entity_type_id, $entity_id) {
  $clone = NULL;
  try {

    /** @var \Drupal\Core\Entity\EntityInterface $entity */

    /** @var \Drupal\Core\Entity\EntityInterface $clone */
    $entity = \Drupal::service('entity_type.manager')
      ->getStorage($entity_type_id)
      ->load($entity_id);
    $clone = $entity
      ->createDuplicate();

    /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $field_definitions */
    $field_definitions = \Drupal::service('entity_field.manager')
      ->getFieldDefinitions($entity
      ->getEntityTypeId(), $entity
      ->bundle());
    foreach ($field_definitions as $definition) {

      // Support for Entity reference revisions.
      if ($definition
        ->getFieldStorageDefinition()
        ->getType() == 'entity_reference_revisions') {
        $new_values = [];
        $target_type = $definition
          ->getFieldStorageDefinition()
          ->getSetting('target_type');
        $values = $clone
          ->get($definition
          ->getName())
          ->getValue();
        if (!empty($values)) {
          foreach ($values as $value) {

            /** @var \Drupal\Core\Entity\EntityInterface $reference */

            /** @var \Drupal\Core\Entity\EntityInterface $reference_clone */
            $reference = \Drupal::service('entity_type.manager')
              ->getStorage($target_type)
              ->load($value['target_id']);
            $reference_clone = $reference
              ->createDuplicate();
            $reference_clone
              ->save();
            $new_values[] = [
              'target_id' => $reference_clone
                ->id(),
              'target_revision_id' => $reference_clone
                ->getRevisionId(),
            ];
          }
          if (!empty($new_values)) {
            $clone
              ->set($definition
              ->getName(), $new_values);
          }
        }
      }
    }
  } catch (\Exception $e) {
    \Drupal::logger('layout_builder_at')
      ->error('Error cloning entity: @message', [
      '@message' => $e
        ->getMessage(),
    ]);
  }
  return $clone;
}