function MigrationLookup::transform

Same name and namespace in other branches
  1. 9 core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php \Drupal\migrate\Plugin\migrate\process\MigrationLookup::transform()
  2. 8.9.x core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php \Drupal\migrate\Plugin\migrate\process\MigrationLookup::transform()
  3. 10 core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php \Drupal\migrate\Plugin\migrate\process\MigrationLookup::transform()

Throws

\Drupal\migrate\MigrateException

Overrides ProcessPluginBase::transform

File

core/modules/migrate/src/Plugin/migrate/process/MigrationLookup.php, line 191

Class

MigrationLookup
Looks up the value of a property based on a previous migration.

Namespace

Drupal\migrate\Plugin\migrate\process

Code

public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    $lookup_migration_ids = (array) $this->configuration['migration'];
    $self = FALSE;
    $destination_ids = NULL;
    $source_id_values = [];
    foreach ($lookup_migration_ids as $lookup_migration_id) {
        $lookup_value = $value;
        if ($lookup_migration_id == $this->migration
            ->id()) {
            $self = TRUE;
        }
        if (isset($this->configuration['source_ids'][$lookup_migration_id])) {
            $lookup_value = array_values($row->getMultiple($this->configuration['source_ids'][$lookup_migration_id]));
        }
        $lookup_value = (array) $lookup_value;
        $this->skipInvalid($lookup_value);
        if ($this->isPipelineStopped()) {
            return NULL;
        }
        $source_id_values[$lookup_migration_id] = $lookup_value;
        // Re-throw any PluginException as a MigrateException so the executable
        // can shut down the migration.
        try {
            $destination_id_array = $this->migrateLookup
                ->lookup($lookup_migration_id, $lookup_value);
        } catch (PluginNotFoundException $e) {
            $destination_id_array = [];
        } catch (MigrateException $e) {
            throw $e;
        } catch (\Exception $e) {
            throw new MigrateException(sprintf('A %s was thrown while processing this migration lookup', gettype($e)), $e->getCode(), $e);
        }
        if ($destination_id_array) {
            $destination_ids = array_values(reset($destination_id_array));
            break;
        }
    }
    if (!$destination_ids && !empty($this->configuration['no_stub'])) {
        return NULL;
    }
    if (!$destination_ids && ($self || isset($this->configuration['stub_id']) || count($lookup_migration_ids) == 1)) {
        // If the lookup didn't succeed, figure out which migration will do the
        // stubbing.
        if ($self) {
            $stub_migration = $this->migration
                ->id();
        }
        elseif (isset($this->configuration['stub_id'])) {
            $stub_migration = $this->configuration['stub_id'];
        }
        else {
            $stub_migration = reset($lookup_migration_ids);
        }
        // Rethrow any exception as a MigrateException so the executable can shut
        // down the migration.
        try {
            $destination_ids = $this->migrateStub
                ->createStub($stub_migration, $source_id_values[$stub_migration], [], FALSE);
        } catch (\LogicException $e) {
            // For BC reasons, we must allow attempting to stub a derived migration.
        } catch (PluginNotFoundException $e) {
            // For BC reasons, we must allow attempting to stub a non-existent
            // migration.
        } catch (MigrateException $e) {
            throw $e;
        } catch (MigrateSkipRowException $e) {
            // Build a new message.
            $skip_row_exception_message = $e->getMessage();
            if (empty($skip_row_exception_message)) {
                $new_message = sprintf("Migration lookup for destination '%s' attempted to create a stub using migration %s, which resulted in a row skip", $destination_property, $stub_migration);
            }
            else {
                $new_message = sprintf("Migration lookup for destination '%s' attempted to create a stub using migration %s, which resulted in a row skip, with message '%s'", $destination_property, $stub_migration, $skip_row_exception_message);
            }
            throw new MigrateSkipRowException($new_message, 0);
        } catch (\Exception $e) {
            throw new MigrateException(sprintf('%s was thrown while attempting to stub: %s', get_class($e), $e->getMessage()), $e->getCode(), $e);
        }
    }
    if ($destination_ids) {
        if (count($destination_ids) == 1) {
            return reset($destination_ids);
        }
        else {
            return $destination_ids;
        }
    }
}

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