function MigrateExecutable::import

Same name and namespace in other branches
  1. 9 core/modules/migrate/src/MigrateExecutable.php \Drupal\migrate\MigrateExecutable::import()
  2. 10 core/modules/migrate/src/MigrateExecutable.php \Drupal\migrate\MigrateExecutable::import()
  3. 11.x core/modules/migrate/src/MigrateExecutable.php \Drupal\migrate\MigrateExecutable::import()

Performs an import operation - migrate items from source to destination.

Overrides MigrateExecutableInterface::import

File

core/modules/migrate/src/MigrateExecutable.php, line 150

Class

MigrateExecutable
Defines a migrate executable class.

Namespace

Drupal\migrate

Code

public function import() {
  // Only begin the import operation if the migration is currently idle.
  if ($this->migration
    ->getStatus() !== MigrationInterface::STATUS_IDLE) {
    $this->message
      ->display($this->t('Migration @id is busy with another operation: @status', [
      '@id' => $this->migration
        ->id(),
      '@status' => $this->t($this->migration
        ->getStatusLabel()),
    ]), 'error');
    return MigrationInterface::RESULT_FAILED;
  }
  $this->getEventDispatcher()
    ->dispatch(MigrateEvents::PRE_IMPORT, new MigrateImportEvent($this->migration, $this->message));
  // Knock off migration if the requirements haven't been met.
  try {
    $this->migration
      ->checkRequirements();
  } catch (RequirementsException $e) {
    $this->message
      ->display($this->t('Migration @id did not meet the requirements. @message @requirements', [
      '@id' => $this->migration
        ->id(),
      '@message' => $e->getMessage(),
      '@requirements' => $e->getRequirementsString(),
    ]), 'error');
    return MigrationInterface::RESULT_FAILED;
  }
  $this->migration
    ->setStatus(MigrationInterface::STATUS_IMPORTING);
  $return = MigrationInterface::RESULT_COMPLETED;
  $source = $this->getSource();
  $id_map = $this->getIdMap();
  try {
    $source->rewind();
  } catch (\Exception $e) {
    $this->message
      ->display($this->t('Migration failed with source plugin exception: @e in @file line @line', [
      '@e' => $e->getMessage(),
      '@file' => $e->getFile(),
      '@line' => $e->getLine(),
    ]), 'error');
    $this->migration
      ->setStatus(MigrationInterface::STATUS_IDLE);
    return MigrationInterface::RESULT_FAILED;
  }
  $destination = $this->migration
    ->getDestinationPlugin();
  while ($source->valid()) {
    $row = $source->current();
    $this->sourceIdValues = $row->getSourceIdValues();
    try {
      $this->processRow($row);
      $save = TRUE;
    } catch (MigrateException $e) {
      $this->getIdMap()
        ->saveIdMapping($row, [], $e->getStatus());
      $this->saveMessage($e->getMessage(), $e->getLevel());
      $save = FALSE;
    } catch (MigrateSkipRowException $e) {
      if ($e->getSaveToMap()) {
        $id_map->saveIdMapping($row, [], MigrateIdMapInterface::STATUS_IGNORED);
      }
      if ($message = trim($e->getMessage())) {
        $this->saveMessage($message, MigrationInterface::MESSAGE_INFORMATIONAL);
      }
      $save = FALSE;
    }
    if ($save) {
      try {
        $this->getEventDispatcher()
          ->dispatch(MigrateEvents::PRE_ROW_SAVE, new MigratePreRowSaveEvent($this->migration, $this->message, $row));
        $destination_ids = $id_map->lookupDestinationIds($this->sourceIdValues);
        $destination_id_values = $destination_ids ? reset($destination_ids) : [];
        $destination_id_values = $destination->import($row, $destination_id_values);
        $this->getEventDispatcher()
          ->dispatch(MigrateEvents::POST_ROW_SAVE, new MigratePostRowSaveEvent($this->migration, $this->message, $row, $destination_id_values));
        if ($destination_id_values) {
          // We do not save an idMap entry for config.
          if ($destination_id_values !== TRUE) {
            $id_map->saveIdMapping($row, $destination_id_values, $this->sourceRowStatus, $destination->rollbackAction());
          }
        }
        else {
          $id_map->saveIdMapping($row, [], MigrateIdMapInterface::STATUS_FAILED);
          if (!$id_map->messageCount()) {
            $message = $this->t('New object was not saved, no error provided');
            $this->saveMessage($message);
            $this->message
              ->display($message);
          }
        }
      } catch (MigrateException $e) {
        $this->getIdMap()
          ->saveIdMapping($row, [], $e->getStatus());
        $this->saveMessage($e->getMessage(), $e->getLevel());
      } catch (\Exception $e) {
        $this->getIdMap()
          ->saveIdMapping($row, [], MigrateIdMapInterface::STATUS_FAILED);
        $this->handleException($e);
      }
    }
    $this->sourceRowStatus = MigrateIdMapInterface::STATUS_IMPORTED;
    // Check for memory exhaustion.
    if (($return = $this->checkStatus()) != MigrationInterface::RESULT_COMPLETED) {
      break;

    }
    // If anyone has requested we stop, return the requested result.
    if ($this->migration
      ->getStatus() == MigrationInterface::STATUS_STOPPING) {
      $return = $this->migration
        ->getInterruptionResult();
      $this->migration
        ->clearInterruptionResult();
      break;

    }
    try {
      $source->next();
    } catch (\Exception $e) {
      $this->message
        ->display($this->t('Migration failed with source plugin exception: @e in @file line @line', [
        '@e' => $e->getMessage(),
        '@file' => $e->getFile(),
        '@line' => $e->getLine(),
      ]), 'error');
      $this->migration
        ->setStatus(MigrationInterface::STATUS_IDLE);
      return MigrationInterface::RESULT_FAILED;
    }
  }
  $this->getEventDispatcher()
    ->dispatch(MigrateEvents::POST_IMPORT, new MigrateImportEvent($this->migration, $this->message));
  $this->migration
    ->setStatus(MigrationInterface::STATUS_IDLE);
  return $return;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.