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()

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.