Update to Drupal 8.1.9. For more information, see https://www.drupal.org/project/drupal/releases/8.1.9
This commit is contained in:
parent
f9f23cdf38
commit
09b113657a
125 changed files with 2307 additions and 385 deletions
|
@ -81,7 +81,7 @@ final class MigrateEvents {
|
|||
*
|
||||
* This event allows modules to perform an action whenever a specific item
|
||||
* is about to be saved by the destination plugin. The event listener method
|
||||
* receives a \Drupal\migrate\Event\MigratePreSaveEvent instance.
|
||||
* receives a \Drupal\migrate\Event\MigratePreRowSaveEvent instance.
|
||||
*
|
||||
* @Event
|
||||
*
|
||||
|
|
|
@ -329,6 +329,12 @@ class MigrateExecutable implements MigrateExecutableInterface {
|
|||
// We're now done with this row, so remove it from the map.
|
||||
$id_map->deleteDestination($destination_key);
|
||||
}
|
||||
else {
|
||||
// If there is no destination key the import probably failed and we can
|
||||
// remove the row without further action.
|
||||
$source_key = $id_map->currentSource();
|
||||
$id_map->delete($source_key);
|
||||
}
|
||||
|
||||
// Check for memory exhaustion.
|
||||
if (($return = $this->checkStatus()) != MigrationInterface::RESULT_COMPLETED) {
|
||||
|
|
|
@ -243,6 +243,14 @@ interface MigrateIdMapInterface extends \Iterator, PluginInspectionInterface {
|
|||
*/
|
||||
public function currentDestination();
|
||||
|
||||
/**
|
||||
* Looks up the source identifier(s) currently being iterated.
|
||||
*
|
||||
* @return array
|
||||
* The source identifier values of the record, or NULL on failure.
|
||||
*/
|
||||
public function currentSource();
|
||||
|
||||
/**
|
||||
* Removes any persistent storage used by this map.
|
||||
*
|
||||
|
|
|
@ -21,7 +21,7 @@ use Drupal\Core\Plugin\DefaultPluginManager;
|
|||
*
|
||||
* @ingroup migration
|
||||
*/
|
||||
class MigratePluginManager extends DefaultPluginManager {
|
||||
class MigratePluginManager extends DefaultPluginManager implements MigratePluginManagerInterface {
|
||||
|
||||
/**
|
||||
* Constructs a MigratePluginManager object.
|
||||
|
@ -49,8 +49,6 @@ class MigratePluginManager extends DefaultPluginManager {
|
|||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* A specific createInstance method is necessary to pass the migration on.
|
||||
*/
|
||||
public function createInstance($plugin_id, array $configuration = array(), MigrationInterface $migration = NULL) {
|
||||
$plugin_definition = $this->getDefinition($plugin_id);
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate\Plugin;
|
||||
|
||||
use Drupal\Component\Plugin\PluginManagerInterface;
|
||||
|
||||
interface MigratePluginManagerInterface extends PluginManagerInterface {
|
||||
|
||||
/**
|
||||
* Creates a pre-configured instance of a migration plugin.
|
||||
*
|
||||
* A specific createInstance method is necessary to pass the migration on.
|
||||
*
|
||||
* @param string $plugin_id
|
||||
* The ID of the plugin being instantiated.
|
||||
* @param array $configuration
|
||||
* An array of configuration relevant to the plugin instance.
|
||||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration context in which the plugin will run.
|
||||
*
|
||||
* @return object
|
||||
* A fully configured plugin instance.
|
||||
*
|
||||
* @throws \Drupal\Component\Plugin\Exception\PluginException
|
||||
* If the instance cannot be created, such as if the ID is invalid.
|
||||
*/
|
||||
public function createInstance($plugin_id, array $configuration = [], MigrationInterface $migration = NULL);
|
||||
|
||||
}
|
|
@ -268,16 +268,16 @@ class Migration extends PluginBase implements MigrationInterface, RequirementsIn
|
|||
* The plugin definition.
|
||||
* @param \Drupal\migrate\Plugin\MigrationPluginManagerInterface $migration_plugin_manager
|
||||
* The migration plugin manager.
|
||||
* @param \Drupal\migrate\Plugin\MigratePluginManager $source_plugin_manager
|
||||
* @param \Drupal\migrate\Plugin\MigratePluginManagerInterface $source_plugin_manager
|
||||
* The source migration plugin manager.
|
||||
* @param \Drupal\migrate\Plugin\MigratePluginManager $process_plugin_manager
|
||||
* @param \Drupal\migrate\Plugin\MigratePluginManagerInterface $process_plugin_manager
|
||||
* The process migration plugin manager.
|
||||
* @param \Drupal\migrate\Plugin\MigrateDestinationPluginManager $destination_plugin_manager
|
||||
* The destination migration plugin manager.
|
||||
* @param \Drupal\migrate\Plugin\MigratePluginManager $idmap_plugin_manager
|
||||
* @param \Drupal\migrate\Plugin\MigratePluginManagerInterface $idmap_plugin_manager
|
||||
* The ID map migration plugin manager.
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManager $source_plugin_manager, MigratePluginManager $process_plugin_manager, MigrateDestinationPluginManager $destination_plugin_manager, MigratePluginManager $idmap_plugin_manager) {
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManagerInterface $source_plugin_manager, MigratePluginManagerInterface $process_plugin_manager, MigrateDestinationPluginManager $destination_plugin_manager, MigratePluginManagerInterface $idmap_plugin_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||
$this->migrationPluginManager = $migration_plugin_manager;
|
||||
$this->sourcePluginManager = $source_plugin_manager;
|
||||
|
|
|
@ -21,4 +21,12 @@ class EntityFieldInstance extends EntityConfigBase {
|
|||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rollback(array $destination_identifier) {
|
||||
$destination_identifier = implode('.', $destination_identifier);
|
||||
parent::rollback(array($destination_identifier));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -20,4 +20,12 @@ class EntityFieldStorageConfig extends EntityConfigBase {
|
|||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rollback(array $destination_identifier) {
|
||||
$destination_identifier = implode('.', $destination_identifier);
|
||||
parent::rollback(array($destination_identifier));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -20,4 +20,12 @@ class EntityViewMode extends EntityConfigBase {
|
|||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function rollback(array $destination_identifier) {
|
||||
$destination_identifier = implode('.', $destination_identifier);
|
||||
parent::rollback(array($destination_identifier));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -845,7 +845,25 @@ class Sql extends PluginBase implements MigrateIdMapInterface, ContainerFactoryP
|
|||
if ($this->valid()) {
|
||||
$result = array();
|
||||
foreach ($this->destinationIdFields() as $destination_field_name => $idmap_field_name) {
|
||||
$result[$destination_field_name] = $this->currentRow[$idmap_field_name];
|
||||
if (!is_null($this->currentRow[$idmap_field_name])) {
|
||||
$result[$destination_field_name] = $this->currentRow[$idmap_field_name];
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function currentSource() {
|
||||
if ($this->valid()) {
|
||||
$result = array();
|
||||
foreach ($this->sourceIdFields() as $field_name => $source_id) {
|
||||
$result[$field_name] = $this->currentKey[$source_id];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,8 @@ use Drupal\migrate\Row;
|
|||
* arguments can be passed to the callback as this would make the migration YAML
|
||||
* file too complex.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2181783 Online handbook documentation for callback process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "callback"
|
||||
* )
|
||||
|
|
|
@ -10,6 +10,8 @@ use Drupal\migrate\Row;
|
|||
/**
|
||||
* Concatenates the strings in the current value.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2345927 Online handbook documentation for concat process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "concat",
|
||||
* handle_multiples = TRUE
|
||||
|
|
|
@ -15,6 +15,8 @@ use Drupal\Component\Utility\Unicode;
|
|||
* creating filter format names, the current value is checked against the
|
||||
* existing filter format names and if it exists, a numeric postfix is added
|
||||
* and incremented until a unique value is created.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2345929 Online handbook documentation for dedupebase process plugin @endlink
|
||||
*/
|
||||
abstract class DedupeBase extends ProcessPluginBase {
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
|||
/**
|
||||
* Ensures value is not duplicated against an entity field.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2135325 Online handbook documentation for dedupe_entity process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "dedupe_entity"
|
||||
* )
|
||||
|
|
|
@ -9,6 +9,8 @@ use Drupal\migrate\Row;
|
|||
/**
|
||||
* This plugin sets missing values on the destination.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2135313 Online handbook documentation for default_value process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "default_value"
|
||||
* )
|
||||
|
|
|
@ -10,6 +10,8 @@ use Drupal\migrate\Row;
|
|||
/**
|
||||
* This plugin explodes a delimited string into an array of values.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2674504 Online handbook documentation for explode process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "explode"
|
||||
* )
|
||||
|
|
|
@ -11,7 +11,7 @@ use Drupal\migrate\Row;
|
|||
/**
|
||||
* This plugin extracts a value from an array.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2152731
|
||||
* @link https://www.drupal.org/node/2152731 Online handbook documentation for extract process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "extract"
|
||||
|
|
|
@ -12,7 +12,7 @@ use Drupal\migrate\Row;
|
|||
* once a single value gets transformed into multiple values. This plugin will
|
||||
* flatten them back down to single values again.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2154215
|
||||
* @link https://www.drupal.org/node/2154215 Online handbook documentation for flatten process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "flatten",
|
||||
|
|
|
@ -9,6 +9,8 @@ use Drupal\migrate\Row;
|
|||
/**
|
||||
* This plugin copies from the source to the destination.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2135307 Online handbook documentation for get process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "get"
|
||||
* )
|
||||
|
|
|
@ -9,7 +9,7 @@ use Drupal\migrate\Row;
|
|||
/**
|
||||
* This plugin iterates and processes an array.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2135345
|
||||
* @link https://www.drupal.org/node/2135345 Online handbook documentation for iterator process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "iterator",
|
||||
|
|
|
@ -17,6 +17,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
|||
* and replaced by an underscore and multiple underscores are collapsed into
|
||||
* one.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2135323 Online handbook documentation for machine_name process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "machine_name"
|
||||
* )
|
||||
|
|
|
@ -4,7 +4,7 @@ namespace Drupal\migrate\Plugin\migrate\process;
|
|||
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
use Drupal\migrate\MigrateSkipProcessException;
|
||||
use Drupal\migrate\Plugin\MigratePluginManager;
|
||||
use Drupal\migrate\Plugin\MigratePluginManagerInterface;
|
||||
use Drupal\migrate\Plugin\MigrationPluginManagerInterface;
|
||||
use Drupal\migrate\Plugin\MigrateIdMapInterface;
|
||||
use Drupal\migrate\ProcessPluginBase;
|
||||
|
@ -16,6 +16,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
|||
/**
|
||||
* Calculates the value of a property based on a previous migration.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2149801 Online handbook documentation for migration process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "migration"
|
||||
* )
|
||||
|
@ -39,7 +41,7 @@ class Migration extends ProcessPluginBase implements ContainerFactoryPluginInter
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManager $process_plugin_manager) {
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrationPluginManagerInterface $migration_plugin_manager, MigratePluginManagerInterface $process_plugin_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition);
|
||||
$this->migrationPluginManager = $migration_plugin_manager;
|
||||
$this->migration = $migration;
|
||||
|
|
|
@ -11,7 +11,10 @@ use Drupal\migrate\ProcessPluginBase;
|
|||
use Drupal\migrate\Row;
|
||||
|
||||
/**
|
||||
* @MigrateProcessPlugin(
|
||||
*
|
||||
* @link https://www.drupal.org/node/2750777 Online handbook documentation for route process plugin @endlink
|
||||
*
|
||||
* * @MigrateProcessPlugin(
|
||||
* id = "route"
|
||||
* )
|
||||
*/
|
||||
|
|
|
@ -11,6 +11,8 @@ use Drupal\migrate\MigrateSkipRowException;
|
|||
/**
|
||||
* If the source evaluates to empty, we skip processing or the whole row.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2228793 Online handbook documentation for skip_on_empty process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "skip_on_empty"
|
||||
* )
|
||||
|
|
|
@ -10,6 +10,8 @@ use Drupal\migrate\MigrateSkipRowException;
|
|||
/**
|
||||
* If the source evaluates to empty, we skip the current row.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2345935 Online handbook documentation for skip_row_if_not_set process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "skip_row_if_not_set",
|
||||
* handle_multiples = TRUE
|
||||
|
|
|
@ -12,7 +12,7 @@ use Drupal\migrate\MigrateSkipRowException;
|
|||
/**
|
||||
* This plugin changes the current value based on a static lookup map.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2143521
|
||||
* @link https://www.drupal.org/node/2143521 Online handbook documentation for static_map process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "static_map"
|
||||
|
|
|
@ -11,6 +11,8 @@ use Drupal\Component\Utility\Unicode;
|
|||
/**
|
||||
* This plugin returns a substring of the current value.
|
||||
*
|
||||
* @link https://www.drupal.org/node/2771965 Online handbook documentation for substr process plugin @endlink
|
||||
*
|
||||
* @MigrateProcessPlugin(
|
||||
* id = "substr"
|
||||
* )
|
||||
|
|
|
@ -128,6 +128,9 @@ class MigrateRollbackTest extends MigrateTestBase {
|
|||
$this->assertNotNull($map_row['destid1']);
|
||||
}
|
||||
|
||||
// Add a failed row to test if this can be rolled back without errors.
|
||||
$this->mockFailure($term_migration, ['id' => '4', 'vocab' => '2', 'name' => 'FAIL']);
|
||||
|
||||
// Rollback and verify the entities are gone.
|
||||
$term_executable->rollback();
|
||||
foreach ($term_data_rows as $row) {
|
||||
|
|
|
@ -640,6 +640,35 @@ class MigrateSqlIdMapTest extends MigrateTestCase {
|
|||
$this->assertSame(0, count($source_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests currentDestination() and currentSource().
|
||||
*/
|
||||
public function testCurrentDestinationAndSource() {
|
||||
// Simple map with one source and one destination ID.
|
||||
$id_map = $this->setupRows(['nid'], ['nid'], [
|
||||
[1, 101],
|
||||
[2, 102],
|
||||
[3, 103],
|
||||
// Mock a failed row by setting the destination ID to NULL.
|
||||
[4, NULL],
|
||||
]);
|
||||
|
||||
// The rows are ordered by destination ID so the failed row should be first.
|
||||
$id_map->rewind();
|
||||
$this->assertEquals([], $id_map->currentDestination());
|
||||
$this->assertEquals(['nid' => 4], $id_map->currentSource());
|
||||
$id_map->next();
|
||||
$this->assertEquals(['nid' => 101], $id_map->currentDestination());
|
||||
$this->assertEquals(['nid' => 1], $id_map->currentSource());
|
||||
$id_map->next();
|
||||
$this->assertEquals(['nid' => 102], $id_map->currentDestination());
|
||||
$this->assertEquals(['nid' => 2], $id_map->currentSource());
|
||||
$id_map->next();
|
||||
$this->assertEquals(['nid' => 103], $id_map->currentDestination());
|
||||
$this->assertEquals(['nid' => 3], $id_map->currentSource());
|
||||
$id_map->next();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the imported count method.
|
||||
*
|
||||
|
|
Reference in a new issue