You are here

protected function EntityContentBase::updateEntity in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php \Drupal\migrate\Plugin\migrate\destination\EntityContentBase::updateEntity()

Updates an entity with the new values from row.

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity to update.

\Drupal\migrate\Row $row: The row object to update from.

Return value

\Drupal\Core\Entity\EntityInterface An updated entity from row values.

3 calls to EntityContentBase::updateEntity()
Book::updateEntity in core/modules/book/src/Plugin/migrate/destination/Book.php
Updates an entity with the new values from row.
EntityContentComplete::updateEntity in core/modules/migrate/src/Plugin/migrate/destination/EntityContentComplete.php
Updates an entity with the new values from row.
EntityRevision::getEntity in core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php
Gets the entity.
3 methods override EntityContentBase::updateEntity()
Book::updateEntity in core/modules/book/src/Plugin/migrate/destination/Book.php
Updates an entity with the new values from row.
EntityContentComplete::updateEntity in core/modules/migrate/src/Plugin/migrate/destination/EntityContentComplete.php
Updates an entity with the new values from row.
EntityRevision::updateEntity in core/modules/migrate/tests/src/Unit/destination/EntityRevisionTest.php
Don't test method from base class.

File

core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php, line 249

Class

EntityContentBase
Provides destination class for all content entities lacking a specific class.

Namespace

Drupal\migrate\Plugin\migrate\destination

Code

protected function updateEntity(EntityInterface $entity, Row $row) {
  $empty_destinations = $row
    ->getEmptyDestinationProperties();

  // By default, an update will be preserved.
  $rollback_action = MigrateIdMapInterface::ROLLBACK_PRESERVE;

  // Make sure we have the right translation.
  if ($this
    ->isTranslationDestination()) {
    $property = $this->storage
      ->getEntityType()
      ->getKey('langcode');
    if ($row
      ->hasDestinationProperty($property)) {
      $language = $row
        ->getDestinationProperty($property);
      if (!$entity
        ->hasTranslation($language)) {
        $entity
          ->addTranslation($language);

        // We're adding a translation, so delete it on rollback.
        $rollback_action = MigrateIdMapInterface::ROLLBACK_DELETE;
      }
      $entity = $entity
        ->getTranslation($language);
    }
  }

  // If the migration has specified a list of properties to be overwritten,
  // clone the row with an empty set of destination values, and re-add only
  // the specified properties.
  if (isset($this->configuration['overwrite_properties'])) {
    $empty_destinations = array_intersect($empty_destinations, $this->configuration['overwrite_properties']);
    $clone = $row
      ->cloneWithoutDestination();
    foreach ($this->configuration['overwrite_properties'] as $property) {
      $clone
        ->setDestinationProperty($property, $row
        ->getDestinationProperty($property));
    }
    $row = $clone;
  }
  foreach ($row
    ->getDestination() as $field_name => $values) {
    $field = $entity->{$field_name};
    if ($field instanceof TypedDataInterface) {
      $field
        ->setValue($values);
    }
  }
  foreach ($empty_destinations as $field_name) {
    $entity->{$field_name} = NULL;
  }
  $this
    ->setRollbackAction($row
    ->getIdMap(), $rollback_action);

  // We might have a different (translated) entity, so return it.
  return $entity;
}