View source
<?php
namespace Drupal\migrate_plus\Plugin\migrate\process;
use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\Plugin\MigratePluginManagerInterface;
use Drupal\migrate\Plugin\MigrationInterface;
use Drupal\migrate\Row;
use Symfony\Component\DependencyInjection\ContainerInterface;
class DomMigrationLookup extends DomStrReplace implements ContainerFactoryPluginInterface {
protected $migration;
protected $processPluginManager;
protected $transformParameters;
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigratePluginManagerInterface $process_plugin_manager) {
$configuration += [
'no_stub' => TRUE,
];
$default_replace_missing = empty($configuration['replace']);
if ($default_replace_missing) {
$configuration['replace'] = 'prevent-requirement-fail';
}
parent::__construct($configuration, $plugin_id, $plugin_definition);
if ($default_replace_missing) {
unset($this->configuration['replace']);
}
$this->migration = $migration;
$this->processPluginManager = $process_plugin_manager;
if (empty($this->configuration['migrations'])) {
throw new InvalidPluginDefinitionException($this
->getPluginId(), "Configuration option 'migration' is required.");
}
if (!is_array($this->configuration['migrations'])) {
throw new InvalidPluginDefinitionException($this
->getPluginId(), "Configuration option 'migration' should be a keyed array.");
}
$default_replace = isset($this->configuration['replace']) ? $this->configuration['replace'] : NULL;
foreach ($this->configuration['migrations'] as $migration_name => $configuration_item) {
if (!empty($configuration_item['replace'])) {
continue;
}
if (is_null($default_replace)) {
throw new InvalidPluginDefinitionException($this
->getPluginId(), "Please define either a global replace for all migrations, or a specific one for 'migrations.{$migration_name}'.");
}
$this->configuration['migrations'][$migration_name]['replace'] = $default_replace;
}
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
return new static($configuration, $plugin_id, $plugin_definition, $migration, $container
->get('plugin.manager.migrate.process'));
}
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
$this
->init($value, $destination_property);
$this->transformParameters = [
'migrate_executable' => $migrate_executable,
'row' => $row,
'destination_property' => $destination_property,
];
foreach ($this->xpath
->query($this->configuration['xpath']) as $html_node) {
$subject = $this
->getSubject($html_node);
if (empty($subject)) {
continue;
}
$search = $this
->getSearch();
if (!preg_match($search, $subject, $matches)) {
continue;
}
$id = $matches[1];
foreach ($this->configuration['migrations'] as $migration_name => $configuration) {
$mapped_id = $this
->migrationLookup($id, $migration_name);
if (!is_null($mapped_id)) {
$replace = str_replace('[mapped-id]', $mapped_id, $configuration['replace']);
$this
->doReplace($html_node, $search, $replace, $subject);
break;
}
}
}
return $this->document;
}
protected function doReplace(\DOMElement $html_node, $search, $replace, $subject) {
$new_subject = preg_replace($search, $replace, $subject);
$this
->postReplace($html_node, $new_subject);
}
protected function migrationLookup($id, $migration_name) {
$mapped_id = NULL;
$parameters = [
$id,
$this->transformParameters['migrate_executable'],
$this->transformParameters['row'],
$this->transformParameters['destination_property'],
];
$plugin_configuration = [
'migration' => $migration_name,
'no_stub' => $this->configuration['no_stub'],
];
$migration_lookup_plugin = $this->processPluginManager
->createInstance('migration_lookup', $plugin_configuration, $this->migration);
$mapped_id = call_user_func_array([
$migration_lookup_plugin,
'transform',
], $parameters);
return $mapped_id;
}
}