Skip to content

Commit 8c01f7c

Browse files
author
Mastiuhin Olexandr
committed
MC-30528: Inconsisten behavior when importing configurable products with custom options and when specifying store_view_code
1 parent f8c7333 commit 8c01f7c

File tree

3 files changed

+54
-16
lines changed

3 files changed

+54
-16
lines changed

app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
namespace Magento\CatalogImportExport\Model\Import\Product;
88

9-
use Magento\CatalogImportExport\Model\Import\Product;
10-
use Magento\Framework\App\ResourceConnection;
11-
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
129
use Magento\Catalog\Api\Data\ProductInterface;
1310
use Magento\Catalog\Model\ResourceModel\Product\Option\Value\Collection as ProductOptionValueCollection;
1411
use Magento\Catalog\Model\ResourceModel\Product\Option\Value\CollectionFactory as ProductOptionValueCollectionFactory;
15-
use Magento\Store\Model\Store;
12+
use Magento\CatalogImportExport\Model\Import\Product;
13+
use Magento\Framework\App\ResourceConnection;
1614
use Magento\ImportExport\Model\Import;
15+
use Magento\ImportExport\Model\Import\ErrorProcessing\ProcessingErrorAggregatorInterface;
16+
use Magento\Store\Model\Store;
1717

1818
/**
1919
* Entity class which provide possibility to import product custom options
@@ -110,6 +110,13 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
110110
'file' => ['sku', 'file_extension', 'image_size_x', 'image_size_y'],
111111
];
112112

113+
/**
114+
* Invalid rows list
115+
*
116+
* @var array
117+
*/
118+
private $_invalidRows;
119+
113120
/**
114121
* Keep product id value for every row which will be imported
115122
*
@@ -433,7 +440,7 @@ protected function _initMessageTemplates()
433440
self::ERROR_INVALID_TYPE,
434441
__(
435442
'Value for \'type\' sub attribute in \'custom_options\' attribute contains incorrect value, acceptable values are: %1',
436-
'\''.implode('\', \'', array_keys($this->_specificTypes)).'\''
443+
'\'' . implode('\', \'', array_keys($this->_specificTypes)) . '\''
437444
)
438445
);
439446
$this->_productEntity->addMessageTemplate(self::ERROR_EMPTY_TITLE, __('Please enter a value for title.'));
@@ -1251,7 +1258,9 @@ protected function _importData()
12511258
$childCount = [];
12521259
$optionsToRemove = [];
12531260
foreach ($bunch as $rowNumber => $rowData) {
1254-
if (isset($optionId, $valueId) && empty($rowData[PRODUCT::COL_STORE_VIEW_CODE])) {
1261+
if (isset($optionId, $valueId) &&
1262+
(empty($rowData[PRODUCT::COL_STORE_VIEW_CODE]) || empty($rowData['custom_options']))
1263+
) {
12551264
$nextOptionId = $optionId;
12561265
$nextValueId = $valueId;
12571266
}
@@ -1548,8 +1557,8 @@ protected function _collectOptionTitle(array $rowData, $prevOptionId, array &$ti
15481557
if (!empty($rowData[self::COLUMN_TITLE])) {
15491558
if (!isset($titles[$prevOptionId][$defaultStoreId])) {
15501559
if (isset($this->lastOptionTitle[$prevOptionId])) {
1551-
$titles[$prevOptionId] = $this->lastOptionTitle[$prevOptionId];
1552-
unset($this->lastOptionTitle);
1560+
$titles[$prevOptionId] = $this->lastOptionTitle[$prevOptionId];
1561+
unset($this->lastOptionTitle);
15531562
} else {
15541563
$titles[$prevOptionId][$defaultStoreId] = $rowData[self::COLUMN_TITLE];
15551564
}

dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest.php

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
use Magento\ImportExport\Model\Import\Source\Csv;
3434
use Magento\Store\Model\Store;
3535
use Magento\Store\Model\StoreManagerInterface;
36+
use Magento\TestFramework\Helper\Bootstrap as BootstrapHelper;
3637
use Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollection;
3738
use Psr\Log\LoggerInterface;
38-
use Magento\TestFramework\Helper\Bootstrap as BootstrapHelper;
3939

4040
/**
4141
* Class ProductTest
@@ -403,7 +403,7 @@ public function testSaveCustomOptionsWithMultipleStoreViews()
403403
$pathToFile = __DIR__ . '/_files/' . $importFile;
404404
$importModel = $this->createImportModel($pathToFile);
405405
$errors = $importModel->validateData();
406-
$this->assertTrue($errors->getErrorsCount() == 0);
406+
$this->assertTrue($errors->getErrorsCount() == 0, 'Import File Validation Failed');
407407
$importModel->importData();
408408
/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
409409
$productRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
@@ -422,20 +422,41 @@ public function testSaveCustomOptionsWithMultipleStoreViews()
422422
$actualOptions = $actualData['options'];
423423
sort($expectedOptions);
424424
sort($actualOptions);
425-
$this->assertEquals($expectedOptions, $actualOptions);
425+
$this->assertEquals(
426+
$expectedOptions,
427+
$actualOptions,
428+
'Expected and actual options arrays does not match'
429+
);
426430

427431
// assert of options data
428-
$this->assertCount(count($expectedData['data']), $actualData['data']);
429-
$this->assertCount(count($expectedData['values']), $actualData['values']);
432+
$this->assertCount(
433+
count($expectedData['data']),
434+
$actualData['data'],
435+
'Expected and actual data count does not match'
436+
);
437+
$this->assertCount(
438+
count($expectedData['values']),
439+
$actualData['values'],
440+
'Expected and actual values count does not match'
441+
);
442+
430443
foreach ($expectedData['options'] as $expectedId => $expectedOption) {
431444
$elementExist = false;
432445
// find value in actual options and values
433446
foreach ($actualData['options'] as $actualId => $actualOption) {
434447
if ($actualOption == $expectedOption) {
435448
$elementExist = true;
436-
$this->assertEquals($expectedData['data'][$expectedId], $actualData['data'][$actualId]);
449+
$this->assertEquals(
450+
$expectedData['data'][$expectedId],
451+
$actualData['data'][$actualId],
452+
'Expected data does not match actual data'
453+
);
437454
if (array_key_exists($expectedId, $expectedData['values'])) {
438-
$this->assertEquals($expectedData['values'][$expectedId], $actualData['values'][$actualId]);
455+
$this->assertEquals(
456+
$expectedData['values'][$expectedId],
457+
$actualData['values'][$actualId],
458+
'Expected values does not match actual data'
459+
);
439460
}
440461
unset($actualData['options'][$actualId]);
441462
// remove value in case of duplicating key values
@@ -448,7 +469,11 @@ public function testSaveCustomOptionsWithMultipleStoreViews()
448469
// Make sure that after importing existing options again, option IDs and option value IDs are not changed
449470
$customOptionValues = $this->getCustomOptionValues($sku);
450471
$this->createImportModel($pathToFile)->importData();
451-
$this->assertEquals($customOptionValues, $this->getCustomOptionValues($sku));
472+
$this->assertEquals(
473+
$customOptionValues,
474+
$this->getCustomOptionValues($sku),
475+
'Option IDs changed after second import'
476+
);
452477
}
453478
}
454479

dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/product_with_custom_options_and_multiple_store_views.csv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@ sku,website_code,store_view_code,attribute_set_code,product_type,name,descriptio
22
simple,base,,Default,simple,New Product,,,9,1,"Catalog, Search","base,secondwebsite",,10,,,,Taxable Goods,new-product,,,,,,,,,,,,,,,,,,,,,,,,"name=Test Field Title,type=field,required=1,sku=1-text,price=100|name=Test Date and Time Title,type=date_time,required=1,sku=2-date,price=200|name=Test Select,type=drop_down,required=1,sku=3-1-select,price=310,option_title=Select Option 1|name=Test Select,type=drop_down,required=1,sku=3-2-select,price=320,option_title=Select Option 2|name=Test Checkbox,type=checkbox,required=1,sku=4-1-select,price=410,option_title=Checkbox Option 1|name=Test Checkbox,type=checkbox,required=1,sku=4-2-select,price=420,option_title=Checkbox Option 2|name=Test Radio,type=radio,required=1,sku=5-1-radio,price=510,option_title=Radio Option 1|name=Test Radio,type=radio,required=1,sku=5-2-radio,price=520,option_title=Radio Option 2",,1,1,999,0,0,0,1,10000,1,1,0,0,,,,,,,,,,,Block after Info Column,,,
33
simple,,default,Default,simple,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Test Field Title_default,type=field,sku=1-text|name=Test Date and Time Title_default,type=date_time,sku=2-date|name=Test Select_default,type=drop_down,sku=3-1-select,option_title=Select Option 1_default|name=Test Select_default,type=drop_down,sku=3-2-select,option_title=Select Option 2_default|name=Test Checkbox_default,type=checkbox,sku=4-1-select,option_title=Checkbox Option 1_default|name=Test Checkbox_default,type=checkbox,sku=4-2-select,option_title=Checkbox Option 2_default|name=Test Radio_default,type=radio,sku=5-1-radio,option_title=Radio Option 1_default|name=Test Radio_default,type=radio,sku=5-2-radio,option_title=Radio Option 2_default",,,,,,,,,,,,,,,,,,,,,,,,,,,
44
simple,,secondstore,Default,simple,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Test Field Title_fixture_second_store,type=field,sku=1-text,price=101|name=Test Date and Time Title_fixture_second_store,type=date_time,sku=2-date,price=201|name=Test Select_fixture_second_store,type=drop_down,sku=3-1-select,price=311,option_title=Select Option 1_fixture_second_store|name=Test Select_fixture_second_store,type=drop_down,sku=3-2-select,price=321,option_title=Select Option 2_fixture_second_store|name=Test Checkbox_second_store,type=checkbox,sku=4-1-select,price=411,option_title=Checkbox Option 1_second_store|name=Test Checkbox_second_store,type=checkbox,sku=4-2-select,price=421,option_title=Checkbox Option 2_second_store|name=Test Radio_fixture_second_store,type=radio,sku=5-1-radio,price=511,option_title=Radio Option 1_fixture_second_store|name=Test Radio_fixture_second_store,type=radio,sku=5-2-radio,price=521,option_title=Radio Option 2_fixture_second_store",,,,,,,,,,,,,,,,,,,,,,,,,,,
5+
newprod2,base,secondstore,Default,configurable,New Product 2,,,9,1,"Catalog, Search","base,secondwebsite",,10,,,,Taxable Goods,new-product-2,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,999,0,0,0,1,10000,1,1,0,0,,,,,,,,,,,Block after Info Column,,,
6+
newprod3,base,,Default,configurable,New Product 3,,,9,1,"Catalog, Search","base,secondwebsite",,10,,,,Taxable Goods,new-product-3,,,,,,,,,,,,,,,,,,,,,,,,"name=Line 1,type=field,max_characters=30,required=1,option_title=Line 1|name=Line 2,type=field,max_characters=30,required=0,option_title=Line 2",,1,1,999,0,0,0,1,10000,1,1,0,0,,,,,,,,,,,Block after Info Column,,,
7+
newprod4,base,secondstore,Default,configurable,New Product 4,,,9,1,"Catalog, Search","base,secondwebsite",,10,,,,Taxable Goods,new-product-4,,,,,,,,,,,,,,,,,,,,,,,,,,1,1,999,0,0,0,1,10000,1,1,0,0,,,,,,,,,,,Block after Info Column,,,
8+
newprod5,base,,Default,configurable,New Product 5,,,9,1,"Catalog, Search","base,secondwebsite",,10,,,,Taxable Goods,new-product-5,,,,,,,,,,,,,,,,,,,,,,,,"name=Line 3,type=field,max_characters=30,required=1,option_title=Line 3|name=Line 4,type=field,max_characters=30,required=0,option_title=Line 4",,1,1,999,0,0,0,1,10000,1,1,0,0,,,,,,,,,,,Block after Info Column,,,

0 commit comments

Comments
 (0)