Skip to content

Commit 663a7d1

Browse files
committed
MAGETWO-58213: [GITHUB] Configurable products import doesn't work configurable_variations not imported #5876
1 parent c804fc0 commit 663a7d1

File tree

4 files changed

+116
-2
lines changed

4 files changed

+116
-2
lines changed

app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Magento\Catalog\Api\Data\ProductInterface;
1212
use Magento\CatalogImportExport\Model\Import\Product as ImportProduct;
1313
use Magento\Framework\EntityManager\MetadataPool;
14+
use Magento\Framework\Exception\LocalizedException;
1415

1516
/**
1617
* Importing configurable products
@@ -472,12 +473,20 @@ protected function _processSuperData()
472473
* @return array
473474
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
474475
* @SuppressWarnings(PHPMD.NPathComplexity)
476+
* @throws LocalizedException
475477
*/
476478
protected function _parseVariations($rowData)
477479
{
478480
$additionalRows = [];
479-
if (!isset($rowData['configurable_variations'])) {
481+
if (empty($rowData['configurable_variations'])) {
480482
return $additionalRows;
483+
} elseif(!empty($rowData['store_view_code'])) {
484+
throw new LocalizedException(
485+
__(
486+
'Product with assigned super attributes should not have specified "%1" value',
487+
'store_view_code'
488+
)
489+
);
481490
}
482491
$variations = explode(ImportProduct::PSEUDO_MULTI_LINE_SEPARATOR, $rowData['configurable_variations']);
483492
foreach ($variations as $variation) {
@@ -822,7 +831,14 @@ protected function configurableInBunch($bunch)
822831
public function isRowValid(array $rowData, $rowNum, $isNewProduct = true)
823832
{
824833
$error = false;
825-
$dataWithExtraVirtualRows = $this->_parseVariations($rowData);
834+
try {
835+
$dataWithExtraVirtualRows = $this->_parseVariations($rowData);
836+
} catch (LocalizedException $exception) {
837+
$this->_entityModel->addRowError($exception->getMessage(), $rowNum);
838+
839+
return false;
840+
}
841+
826842
$skus = [];
827843
$rowData['price'] = isset($rowData['price']) && $rowData['price'] ? $rowData['price'] : '0.00';
828844
if (!empty($dataWithExtraVirtualRows)) {

dev/tests/integration/testsuite/Magento/ConfigurableImportExport/Model/Import/Product/Type/ConfigurableTest.php

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
/**
1212
* @magentoAppArea adminhtml
13+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1314
*/
1415
class ConfigurableTest extends \PHPUnit\Framework\TestCase
1516
{
@@ -64,6 +65,7 @@ public function configurableImportDataProvider()
6465
* @param $optionSkuList Name of variations for configurable product
6566
* @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
6667
* @magentoAppArea adminhtml
68+
* @magentoAppIsolation enabled
6769
* @dataProvider configurableImportDataProvider
6870
*/
6971
public function testConfigurableImport($pathToFile, $productName, $optionSkuList)
@@ -148,4 +150,91 @@ public function testConfigurableImport($pathToFile, $productName, $optionSkuList
148150
$this->assertEquals(2, count($valuesData));
149151
}
150152
}
153+
154+
/**
155+
* @magentoDataFixture Magento/Store/_files/second_store.php
156+
* @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
157+
* @magentoAppArea adminhtml
158+
* @magentoAppIsolation enabled
159+
*/
160+
public function testConfigurableImportWithMultipleStores()
161+
{
162+
$productSku = 'Configurable 1';
163+
$products = [
164+
'default' => 'Configurable 1',
165+
'fixture_second_store' => 'Configurable 1 Second Store',
166+
];
167+
$filesystem = $this->objectManager->create(
168+
\Magento\Framework\Filesystem::class
169+
);
170+
171+
$directory = $filesystem->getDirectoryWrite(DirectoryList::ROOT);
172+
$source = $this->objectManager->create(
173+
\Magento\ImportExport\Model\Import\Source\Csv::class,
174+
[
175+
'file' => __DIR__ . '/../../_files/import_configurable_for_multiple_store_views.csv',
176+
'directory' => $directory,
177+
]
178+
);
179+
$errors = $this->model->setSource(
180+
$source
181+
)->setParameters(
182+
[
183+
'behavior' => \Magento\ImportExport\Model\Import::BEHAVIOR_APPEND,
184+
'entity' => 'catalog_product',
185+
]
186+
)->validateData();
187+
188+
$this->assertTrue($errors->getErrorsCount() == 0);
189+
$this->model->importData();
190+
191+
foreach ($products as $storeCode => $productName) {
192+
$store = $this->objectManager->create(\Magento\Store\Model\Store::class);
193+
$store->load($storeCode, 'code');
194+
/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
195+
$productRepository = $this->objectManager->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
196+
/** @var \Magento\Catalog\Api\Data\ProductInterface $product */
197+
$product = $productRepository->get($productSku, 0, $store->getId());
198+
$this->assertFalse($product->isObjectNew());
199+
$this->assertEquals($productName, $product->getName());
200+
$this->assertEquals(self::TEST_PRODUCT_TYPE, $product->getTypeId());
201+
}
202+
}
203+
204+
/**
205+
* @magentoDataFixture Magento/Store/_files/second_store.php
206+
* @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
207+
* @magentoDbIsolation disabled
208+
* @magentoAppArea adminhtml
209+
*/
210+
public function testConfigurableImportWithStoreSpecifiedMainItem()
211+
{
212+
{
213+
$expectedErrorMessage = 'Product with assigned super attributes should not have specified "store_view_code"'
214+
. ' value';
215+
$filesystem = $this->objectManager->create(
216+
\Magento\Framework\Filesystem::class
217+
);
218+
219+
$directory = $filesystem->getDirectoryWrite(DirectoryList::ROOT);
220+
$source = $this->objectManager->create(
221+
\Magento\ImportExport\Model\Import\Source\Csv::class,
222+
[
223+
'file' => __DIR__ . '/../../_files/import_configurable_for_multiple_store_views_error.csv',
224+
'directory' => $directory,
225+
]
226+
);
227+
$errors = $this->model->setSource(
228+
$source
229+
)->setParameters(
230+
[
231+
'behavior' => \Magento\ImportExport\Model\Import::BEHAVIOR_APPEND,
232+
'entity' => 'catalog_product',
233+
]
234+
)->validateData();
235+
236+
$this->assertTrue($errors->getErrorsCount() == 1);
237+
$this->assertEquals($expectedErrorMessage, $errors->getAllErrors()[0]->getErrorMessage());
238+
}
239+
}
151240
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
sku,store_view_code,attribute_set_code,product_type,name,description,short_description,weight,product_online,tax_class_name,visibility,price,url_key,display_product_options_in,map_price,additional_attributes,qty,out_of_stock_qty,use_config_min_qty,is_qty_decimal,allow_backorders,use_config_backorders,min_cart_qty,use_config_min_sale_qty,max_cart_qty,use_config_max_sale_qty,is_in_stock,notify_on_stock_below,use_config_notify_stock_qty,manage_stock,use_config_manage_stock,use_config_qty_increments,qty_increments,use_config_enable_qty_inc,enable_qty_increments,is_decimal_divided,website_id,configurable_variations,configurable_variation_labels,associated_skus
2+
Configurable 1-Option 1,,Default,simple,Configurable 1-Option 1,,,,1,Taxable Goods,Not Visible Individually,10,configurable-1-option-1,Block after Info Column,,"attribute_with_option=Option Label,has_options=0,quantity_and_stock_status=In Stock,required_options=0,test_configurable=Option 1",99999,0,0,0,0,1,1,0,0,0,1,,1,1,0,0,1,0,0,0,1,,,
3+
Configurable 1-Option 2,,Default,simple,Configurable 1-Option 2,,,,1,Taxable Goods,Not Visible Individually,10,configurable-1-option-2,Block after Info Column,,"has_options=0,quantity_and_stock_status=In Stock,required_options=0,test_configurable=Option 2",99999,0,0,0,0,1,1,0,0,0,1,,1,1,0,0,1,0,0,0,1,,,
4+
Configurable 1,,Default,configurable,Configurable 1,,,,1,Taxable Goods,"Catalog, Search",10,configurable-1,Block after Info Column,,"has_options=1,quantity_and_stock_status=In Stock,required_options=0",0,0,0,0,0,1,1,0,0,0,1,,1,0,0,0,1,0,0,0,1,"sku=Configurable 1-Option 1,test_configurable=Option 1|sku=Configurable 1-Option 2,test_configurable=Option 2",test_configurable=test_configurable_custom_label,
5+
Configurable 1,fixture_second_store,Default,configurable,Configurable 1 Second Store,,,,1,Taxable Goods,"Catalog, Search",10,configurable-1,Block after Info Column,,"has_options=1,quantity_and_stock_status=In Stock,required_options=0",0,0,0,0,0,1,1,0,0,0,1,,1,0,0,0,1,0,0,0,1,,test_configurable=test_configurable_custom_label_second_store,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
sku,store_view_code,attribute_set_code,product_type,name,description,short_description,weight,product_online,tax_class_name,visibility,price,url_key,display_product_options_in,map_price,additional_attributes,qty,out_of_stock_qty,use_config_min_qty,is_qty_decimal,allow_backorders,use_config_backorders,min_cart_qty,use_config_min_sale_qty,max_cart_qty,use_config_max_sale_qty,is_in_stock,notify_on_stock_below,use_config_notify_stock_qty,manage_stock,use_config_manage_stock,use_config_qty_increments,qty_increments,use_config_enable_qty_inc,enable_qty_increments,is_decimal_divided,website_id,configurable_variations,configurable_variation_labels,associated_skus
2+
Configurable 1-Option 1,,Default,simple,Configurable 1-Option 1,,,,1,Taxable Goods,Not Visible Individually,10,configurable-1-option-1,Block after Info Column,,"attribute_with_option=Option Label,has_options=0,quantity_and_stock_status=In Stock,required_options=0,test_configurable=Option 1",99999,0,0,0,0,1,1,0,0,0,1,,1,1,0,0,1,0,0,0,1,,,
3+
Configurable 1-Option 2,,Default,simple,Configurable 1-Option 2,,,,1,Taxable Goods,Not Visible Individually,10,configurable-1-option-2,Block after Info Column,,"has_options=0,quantity_and_stock_status=In Stock,required_options=0,test_configurable=Option 2",99999,0,0,0,0,1,1,0,0,0,1,,1,1,0,0,1,0,0,0,1,,,
4+
Configurable 1,default,Default,configurable,Configurable 1,,,,1,Taxable Goods,"Catalog, Search",10,configurable-1,Block after Info Column,,"has_options=1,quantity_and_stock_status=In Stock,required_options=0",0,0,0,0,0,1,1,0,0,0,1,,1,0,0,0,1,0,0,0,1,"sku=Configurable 1-Option 1,test_configurable=Option 1|sku=Configurable 1-Option 2,test_configurable=Option 2",test_configurable=test_configurable_custom_label,

0 commit comments

Comments
 (0)