diff --git a/commerce_migrate.services.yml b/commerce_migrate.services.yml index e9d79c2..8616c93 100644 --- a/commerce_migrate.services.yml +++ b/commerce_migrate.services.yml @@ -7,3 +7,7 @@ services: class: Drupal\commerce_migrate\EventSubscriber\MigrateOrderItem tags: - { name: event_subscriber } + commerce_migrate.migrate_product: + class: Drupal\commerce_migrate\EventSubscriber\MigrateProduct + tags: + - { name: event_subscriber } \ No newline at end of file diff --git a/modules/commerce/migration_templates/d7_product.yml b/modules/commerce/migration_templates/d7_product.yml index fee1722..5d25a6e 100644 --- a/modules/commerce/migration_templates/d7_product.yml +++ b/modules/commerce/migration_templates/d7_product.yml @@ -6,6 +6,12 @@ migration_tags: source: plugin: d7_product process: +# This is the product id and not the product variation id. +# It may not be correct after this migration. It is back +# reference to the product id which is migrated in the +# product migration, d7_product_display, and is run after +# this migration. This value is updated via the event +# subscriber MigrateProduct. product_id: product_id revision_id: revision_id sku: sku diff --git a/modules/commerce/migration_templates/d7_product_display.yml b/modules/commerce/migration_templates/d7_product_display.yml index 1c4e636..cafc456 100644 --- a/modules/commerce/migration_templates/d7_product_display.yml +++ b/modules/commerce/migration_templates/d7_product_display.yml @@ -15,6 +15,9 @@ process: created: created changed: changed path: path + # Note that a post event subscriber, MigrateProduct, + # is used to update the back reference to the product id + # for all variations. variations: plugin: commerce_migrate_commerce_reference source: variations_field diff --git a/modules/commerce/tests/src/Kernel/Migrate/d7/ProductTest.php b/modules/commerce/tests/src/Kernel/Migrate/d7/ProductTest.php index b1e5399..ecf379a 100644 --- a/modules/commerce/tests/src/Kernel/Migrate/d7/ProductTest.php +++ b/modules/commerce/tests/src/Kernel/Migrate/d7/ProductTest.php @@ -54,7 +54,13 @@ class ProductTest extends Commerce1TestBase { $product = Product::load(15); $variation_id = $product->variations->target_id; - $this->assertProductVariationEntity($variation_id, '0', 'TOT1-GRN-OS', '16.000000', 'USD', '1', 'Tote Bag 1', 'default'); + $this->assertProductVariationEntity($variation_id, '0', 'TOT1-GRN-OS', '16.000000', 'USD', '15', 'Tote Bag 1', 'default'); + + // Tests a product with multiple variations. + $this->assertProductEntity(26, '1', 'Commerce Guys USB Key', TRUE, ['1'], ['28', '29', '30']); + $this->assertProductVariationEntity(28, '0', 'USB-BLU-08', '11.990000', 'USD', '26', 'Storage 1', 'default'); + $this->assertProductVariationEntity(29, '0', 'USB-BLU-16', '17.990000', 'USD', '26', 'Storage 1', 'default'); + $this->assertProductVariationEntity(30, '0', 'USB-BLU-32', '29.990000', 'USD', '26', 'Storage 1', 'default'); } } diff --git a/src/EventSubscriber/MigrateProduct.php b/src/EventSubscriber/MigrateProduct.php new file mode 100644 index 0000000..702b6e9 --- /dev/null +++ b/src/EventSubscriber/MigrateProduct.php @@ -0,0 +1,54 @@ +getMigration()->getDestinationConfiguration(); + + // Ensure the back reference to the product is correct for all variations + // of this product. + if ($event->getMigration()->id() == 'd7_product_display') { + $variations = $event->getRow()->getDestinationProperty('variations'); + $product_id = $event->getRow()->getDestinationProperty('product_id'); + $product = Product::load($product_id); + if ($product) { + foreach ($variations as $variation) { + $variation = ProductVariation::load($variation); + if ($variation) { + $variation->set('product_id', $product_id); + $variation->save(); + } + } + } + } + } + +} +