/** * Processes a row. * * @param \Drupal\migrate\Row $row * The $row to be processed. * @param array $process * (optional) A process pipeline configuration. If not set, the top level * process configuration in the migration entity is used. * @param mixed $value * (optional) Initial value of the pipeline for the first destination. * Usually setting this is not necessary as $process typically starts with * a 'get'. This is useful only when the $process contains a single * destination and needs to access a value outside of the source. See * \Drupal\migrate\Plugin\migrate\process\Iterator::transformKey for an * example. * * @throws \Drupal\migrate\MigrateException */ public function processRow(Row $row, array $process = NULL, $value = NULL) { foreach ($this->migration->getProcessPlugins($process) as $destination => $plugins) { $multiple = FALSE; /** @var $plugin \Drupal\migrate\Plugin\MigrateProcessInterface */ foreach ($plugins as $plugin) { $definition = $plugin->getPluginDefinition(); // Many plugins expect a scalar value but the current value of the // pipeline might be multiple scalars (this is set by the previous // plugin) and in this case the current value needs to be iterated // and each scalar separately transformed. if ($multiple && !$definition['handle_multiples']) { $new_value = array(); if (!is_array($value)) { throw new MigrateException(sprintf('Pipeline failed for destination %s: %s got instead of an array,', $destination, $value)); } $break = FALSE; foreach ($value as $scalar_value) { try { $new_value[] = $plugin->transform($scalar_value, $this, $row, $destination); } catch (MigrateSkipProcessException $e) { $break = TRUE; } } $value = $new_value; if ($break) { break; } } else { try { $value = $plugin->transform($value, $this, $row, $destination); } catch (MigrateSkipProcessException $e) { break; } $multiple = $multiple || $plugin->multiple(); } } // No plugins means do not set. if ($plugins) { $row->setDestinationProperty($destination, $value); } // Reset the value. $value = NULL; } }