diff --git a/core/modules/migrate/src/Plugin/MigrateProcessInterface.php b/core/modules/migrate/src/Plugin/MigrateProcessInterface.php index abfd523..6f9d7ae 100644 --- a/core/modules/migrate/src/Plugin/MigrateProcessInterface.php +++ b/core/modules/migrate/src/Plugin/MigrateProcessInterface.php @@ -14,6 +14,12 @@ /** * An interface for migrate process plugins. * + * A process plugin can use any number of methods instead of (but not in + * addition to) transform with the same arguments and then the plugin + * configuration needs to provide the name of the method to be called via the + * "method" key. See \Drupal\migrate\Plugin\migrate\process\SkipOnEmpty and + * migrate.migration.d6_field_instance_widget_settings.yml for examples. + * * @see \Drupal\migrate\Plugin\MigratePluginManager * @see \Drupal\migrate\ProcessPluginBase * @see \Drupal\migrate\Annotation\MigrateProcessPlugin diff --git a/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php b/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php new file mode 100644 index 0000000..7c15db4 --- /dev/null +++ b/core/modules/migrate/src/Plugin/migrate/process/SkipOnEmpty.php @@ -0,0 +1,45 @@ +configuration['method'])) { + if (method_exists($this, $this->configuration['method'])) { + return $this->{$this->configuration['method']}($value, $migrate_executable, $row, $destination_property); + } + throw new \BadMethodCallException(sprintf('The %s method does not exist in the %s plugin.', $this->configuration['method'], $this->pluginId)); + } + else { + throw new \BadMethodCallException(sprintf('The "method" key in the plugin configuration must to be set for the %s plugin.', $this->pluginId)); + } + } + + /** + * {@inheritdoc} + */ public function multiple() { return FALSE; } diff --git a/core/modules/migrate/tests/src/Unit/process/SkipOnEmptyTest.php b/core/modules/migrate/tests/src/Unit/process/SkipOnEmptyTest.php new file mode 100644 index 0000000..3a0d08c --- /dev/null +++ b/core/modules/migrate/tests/src/Unit/process/SkipOnEmptyTest.php @@ -0,0 +1,60 @@ +transform('', $this->migrateExecutable, $this->row, 'destinationproperty'); + } + + /** + * @covers ::process + */ + public function testProcessBypassesOnNonEmpty() { + $configuration['method'] = 'process'; + $value = (new SkipOnEmpty($configuration, 'skip_on_empty', [])) + ->transform(' ', $this->migrateExecutable, $this->row, 'destinationproperty'); + $this->assertSame($value, ' '); + } + + /** + * @covers ::row + * @expectedException \Drupal\migrate\MigrateSkipRowException + */ + public function testRowSkipsOnEmpty() { + $configuration['method'] = 'row'; + (new SkipOnEmpty($configuration, 'skip_on_empty', [])) + ->transform('', $this->migrateExecutable, $this->row, 'destinationproperty'); + } + + /** + * @covers ::row + */ + public function testRowBypassesOnNonEmpty() { + $configuration['method'] = 'row'; + $value = (new SkipOnEmpty($configuration, 'skip_on_empty', [])) + ->transform(' ', $this->migrateExecutable, $this->row, 'destinationproperty'); + $this->assertSame($value, ' '); + } + +} diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_block.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_block.yml index ef02e6f..1d83119 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_block.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_block.yml @@ -8,7 +8,8 @@ process: # Drupal 8 does not have a status but it doesn't matter; this is here to # skip disabled blocks. status: - plugin: skip_row_on_empty + plugin: skip_on_empty + method: row source: status id: # We need something unique, so aggregator, aggregator_1 etc will do. diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_book.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_book.yml index b6b668d..c8007e0 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_book.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_book.yml @@ -10,7 +10,8 @@ process: 'book/weight': weight 'book/pid': - - plugin: skip_process_on_empty + plugin: skip_on_empty + method: process source: plid - plugin: migration diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_formatter_settings.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_formatter_settings.yml index c5165b3..39401f8 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_formatter_settings.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_formatter_settings.yml @@ -22,7 +22,8 @@ process: index: - 1 - - plugin: skip_row_on_empty + plugin: skip_on_empty + method: row entity_type: 'constants/entity_type' bundle: type_name view_mode: diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance.yml index c7dda06..5710433 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance.yml @@ -21,7 +21,8 @@ process: index: - 1 - - plugin: skip_row_on_empty + plugin: skip_on_empty + method: row entity_type: 'constants/entity_type' field_name: field_name bundle: type_name diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance_widget_settings.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance_widget_settings.yml index 4bd3fad..a343abe 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance_widget_settings.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_field_instance_widget_settings.yml @@ -23,7 +23,8 @@ process: index: - 1 - - plugin: skip_row_on_empty + plugin: skip_on_empty + method: row bundle: type_name form_mode: 'constants/form_mode' field_name: field_name diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_menu_links.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_menu_links.yml index 2ad8032..c98a3a7 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_menu_links.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_menu_links.yml @@ -33,7 +33,8 @@ process: enabled: enabled parent: - - plugin: skip_process_on_empty + plugin: skip_on_empty + method: process source: plid - plugin: migration diff --git a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_taxonomy_term.yml b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_taxonomy_term.yml index 826a1fa..c70d3c8 100644 --- a/core/modules/migrate_drupal/config/optional/migrate.migration.d6_taxonomy_term.yml +++ b/core/modules/migrate_drupal/config/optional/migrate.migration.d6_taxonomy_term.yml @@ -15,7 +15,8 @@ process: weight: weight parent: - - plugin: skip_process_on_empty + plugin: skip_on_empty + method: process source: parent - plugin: migration diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php b/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php index 181cb44..c3b574c 100644 --- a/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php +++ b/core/modules/migrate_drupal/src/Plugin/migrate/load/LoadEntity.php @@ -141,7 +141,10 @@ protected function processTextField($field_name, $field_data, MigrationInterface 'source' => $format_key, 'map' => [0 => NULL] ], - ['plugin' => 'skip_process_on_empty'], + [ + 'plugin' => 'skip_on_empty', + 'method' => 'process', + ], [ 'plugin' => 'migration', 'migration' => 'd6_filter_format',