diff -u b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php --- b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php +++ b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php @@ -122,8 +122,10 @@ $this->updateEntity($entity, $row); } else { - if ($bundle = $this->getEntityBundleId()) { - $row->setDestinationProperty($this->getKey('bundle'), $bundle); + $bundle_key = $this->getKey('bundle'); + // Apply any configured bundle if the bundle has not already been set. + if (($bundle = $this->getEntityBundleId()) && empty($row->getDestinationProperty($bundle_key))) { + $row->setDestinationProperty($bundle_key, $bundle); } // Stubs might need some required fields filled in. only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/src/Kernel/MigrateBundleTest.php @@ -0,0 +1,155 @@ +installEntitySchema('taxonomy_vocabulary'); + $this->installEntitySchema('taxonomy_term'); + $this->installConfig(['taxonomy']); + // Set up two vocabularies (taxonomy bundles). + Vocabulary::create(['vid' => 'tags', 'name' => 'Tags']); + Vocabulary::create(['vid' => 'categories', 'name' => 'Categories']); + } + + /** + * Tests setting the bundle in the destination. + */ + public function testDestinationBundle() { + $term_data_rows = [ + ['id' => 1, 'name' => 'Category 1'], + ]; + $ids = ['id' => ['type' => 'integer']]; + $definition = [ + 'id' => 'terms', + 'migration_tags' => ['Bundle test'], + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => $term_data_rows, + 'ids' => $ids, + ], + 'process' => [ + 'tid' => 'id', + 'name' => 'name', + ], + 'destination' => [ + 'plugin' => 'entity:taxonomy_term', + 'bundle' => 'categories', + ], + 'migration_dependencies' => [], + ]; + + $term_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition); + + // Import and validate the term entity was created with the correct bundle. + $term_executable = new MigrateExecutable($term_migration, $this); + $term_executable->import(); + /** @var Term $term */ + $term = Term::load(1); + $this->assertEquals($term->bundle(), 'categories'); + } + + /** + * Tests setting the bundle in the process pipeline. + */ + public function testProcessBundle() { + $term_data_rows = [ + ['id' => 1, 'vocab' => 'categories', 'name' => 'Category 1'], + ['id' => 2, 'vocab' => 'tags', 'name' => 'Tag 1'], + ]; + $ids = ['id' => ['type' => 'integer']]; + $definition = [ + 'id' => 'terms', + 'migration_tags' => ['Bundle test'], + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => $term_data_rows, + 'ids' => $ids, + ], + 'process' => [ + 'tid' => 'id', + 'vid' => 'vocab', + 'name' => 'name', + ], + 'destination' => [ + 'plugin' => 'entity:taxonomy_term', + ], + 'migration_dependencies' => [], + ]; + + $term_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition); + + // Import and validate the term entities were created with the correct bundle. + $term_executable = new MigrateExecutable($term_migration, $this); + $term_executable->import(); + /** @var Term $term */ + $term = Term::load(1); + $this->assertEquals($term->bundle(), 'categories'); + $term = Term::load(2); + $this->assertEquals($term->bundle(), 'tags'); + } + + /** + * Tests setting bundles both in process and destination. + */ + public function testMixedBundles() { + $term_data_rows = [ + ['id' => 1, 'vocab' => 'categories', 'name' => 'Category 1'], + ['id' => 2, 'name' => 'Tag 1'], + ]; + $ids = ['id' => ['type' => 'integer']]; + $definition = [ + 'id' => 'terms', + 'migration_tags' => ['Bundle test'], + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => $term_data_rows, + 'ids' => $ids, + ], + 'process' => [ + 'tid' => 'id', + 'vid' => 'vocab', + 'name' => 'name', + ], + 'destination' => [ + 'plugin' => 'entity:taxonomy_term', + // When no vocab is provided, the destination bundle is applied. + 'bundle' => 'tags', + ], + 'migration_dependencies' => [], + ]; + + $term_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition); + + // Import and validate the term entities were created with the correct bundle. + $term_executable = new MigrateExecutable($term_migration, $this); + $term_executable->import(); + /** @var Term $term */ + $term = Term::load(1); + $this->assertEquals($term->bundle(), 'categories'); + $term = Term::load(2); + $this->assertEquals($term->bundle(), 'tags'); + } + +}