Skip to content

Commit 7db18d4

Browse files
committed
ACP2E-2261: [Cloud] Product import fails with custom separator value
1 parent bc97e27 commit 7db18d4

File tree

6 files changed

+28
-67
lines changed

6 files changed

+28
-67
lines changed

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

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,7 +2836,7 @@ private function prepareNewSkuData($sku)
28362836
*
28372837
* @return array
28382838
*/
2839-
private function _parseAdditionalAttributes(array $rowData): array
2839+
private function _parseAdditionalAttributes($rowData)
28402840
{
28412841
if (empty($rowData['additional_attributes'])) {
28422842
return $rowData;
@@ -2846,7 +2846,7 @@ private function _parseAdditionalAttributes(array $rowData): array
28462846
$rowData[mb_strtolower($key)] = $value;
28472847
}
28482848
} else {
2849-
$rowData = array_merge($rowData, $this->getAdditionalAttributes($rowData));
2849+
$rowData = array_merge($rowData, $this->getAdditionalAttributes($rowData['additional_attributes']));
28502850
}
28512851
return $rowData;
28522852
}
@@ -2860,14 +2860,14 @@ private function _parseAdditionalAttributes(array $rowData): array
28602860
* codeN => valueN
28612861
* ]
28622862
*
2863-
* @param array $rowData
2863+
* @param string $additionalAttributes Attributes data that will be parsed
28642864
* @return array
28652865
*/
2866-
private function getAdditionalAttributes(array $rowData): array
2866+
private function getAdditionalAttributes($additionalAttributes)
28672867
{
28682868
return empty($this->_parameters[Import::FIELDS_ENCLOSURE])
2869-
? $this->parseAttributesWithoutWrappedValues($rowData['additional_attributes'], $rowData['product_type'])
2870-
: $this->parseAttributesWithWrappedValues($rowData['additional_attributes']);
2869+
? $this->parseAttributesWithoutWrappedValues($additionalAttributes)
2870+
: $this->parseAttributesWithWrappedValues($additionalAttributes);
28712871
}
28722872

28732873
/**
@@ -2881,10 +2881,9 @@ private function getAdditionalAttributes(array $rowData): array
28812881
*
28822882
* @param string $attributesData Attributes data that will be parsed. It keeps data in format:
28832883
* code=value,code2=value2...,codeN=valueN
2884-
* @param string $productType
28852884
* @return array
28862885
*/
2887-
private function parseAttributesWithoutWrappedValues(string $attributesData, string $productType): array
2886+
private function parseAttributesWithoutWrappedValues($attributesData)
28882887
{
28892888
$attributeNameValuePairs = explode($this->getMultipleValueSeparator(), $attributesData);
28902889
$preparedAttributes = [];
@@ -2900,21 +2899,10 @@ private function parseAttributesWithoutWrappedValues(string $attributesData, str
29002899
}
29012900
list($code, $value) = explode(self::PAIR_NAME_VALUE_SEPARATOR, $attributeData, 2);
29022901
$code = mb_strtolower($code);
2903-
2904-
$entityTypeModel = $this->retrieveProductTypeByName($productType);
2905-
if ($entityTypeModel) {
2906-
$attrParams = $entityTypeModel->retrieveAttributeFromCache($code);
2907-
if (!empty($attrParams) && $attrParams['type'] == 'multiselect') {
2908-
$attributeValue = $this->parseMultiselectValues($value, Product::PSEUDO_MULTI_LINE_SEPARATOR);
2909-
if (count($attributeValue) > 1) {
2910-
$preparedAttributes[$code] = $attributeValue;
2911-
} else {
2912-
$preparedAttributes[$code] = $value;
2913-
}
2914-
}
2915-
} else {
2916-
$preparedAttributes[$code] = $value;
2902+
if (str_contains($value, self::PSEUDO_MULTI_LINE_SEPARATOR)) {
2903+
$value = $this->parseMultiselectValues($value, self::PSEUDO_MULTI_LINE_SEPARATOR);
29172904
}
2905+
$preparedAttributes[$code] = $value;
29182906
}
29192907
return $preparedAttributes;
29202908
}

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Magento\CatalogImportExport\Model\Import\Product;
99
use Magento\Framework\Validator\AbstractValidator;
1010
use Magento\Catalog\Model\Product\Attribute\Backend\Sku;
11-
use Magento\ImportExport\Model\Import;
1211

1312
/**
1413
* Product import model validator
@@ -273,11 +272,8 @@ private function validateByAttributeType(string $attrCode, array $attrParams, ar
273272
* @param array|string $rowData
274273
* @return bool
275274
*/
276-
private function validateMultiselect(
277-
string $attrCode,
278-
array $options,
279-
array|string $rowData
280-
): bool {
275+
private function validateMultiselect(string $attrCode, array $options, array|string $rowData): bool
276+
{
281277
$valid = true;
282278

283279
$values = $this->context->parseMultiselectValues($rowData);

app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/Product/ValidatorTest.php

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected function setUp(): void
4747
$entityTypeModel->expects($this->any())->method('retrieveAttributeFromCache')->willReturn([]);
4848
$this->context = $this->createPartialMock(
4949
Product::class,
50-
['retrieveProductTypeByName', 'retrieveMessageTemplate', 'getBehavior']
50+
['retrieveProductTypeByName', 'retrieveMessageTemplate', 'getBehavior', 'getMultipleValueSeparator']
5151
);
5252
$this->context->expects($this->any())->method('retrieveProductTypeByName')->willReturn($entityTypeModel);
5353
$this->context->expects($this->any())->method('retrieveMessageTemplate')->willReturn('error message');
@@ -83,6 +83,7 @@ protected function setUp(): void
8383
*/
8484
public function testAttributeValidation($behavior, $attrParams, $rowData, $isValid, $attrCode = 'attribute_code')
8585
{
86+
$this->context->method('getMultipleValueSeparator')->willReturn(Product::PSEUDO_MULTI_LINE_SEPARATOR);
8687
$this->context->expects($this->any())->method('getBehavior')->willReturn($behavior);
8788
$result = $this->validator->isAttributeValid(
8889
$attrCode,
@@ -169,58 +170,33 @@ public function attributeValidationProvider()
169170
[
170171
Import::BEHAVIOR_APPEND,
171172
['is_required' => true, 'type' => 'multiselect', 'options' => ['option 1' => 0, 'option 2' => 1]],
172-
[
173-
'product_type' => 'any',
174-
'attribute_code' => 'Option 1|Option 2|Option 3',
175-
'additional_attributes' => 'test_attribute=any,attribute_code=Option 1|Option 2|Option 3'
176-
],
173+
['product_type' => 'any', 'attribute_code' => 'Option 1|Option 2|Option 3'],
177174
false
178175
],
179176
[
180177
Import::BEHAVIOR_APPEND,
181178
['is_required' => true, 'type' => 'multiselect', 'options' => ['option 1' => 0, 'option 2' => 1]],
182-
[
183-
'product_type' => 'any',
184-
'attribute_code' => 'Option 1|Option 2',
185-
'additional_attributes' => 'test_attribute=any,attribute_code=Option 1|Option 2'
186-
],
179+
['product_type' => 'any', 'attribute_code' => 'Option 1|Option 2'],
187180
true
188181
],
189182
[
190183
Import::BEHAVIOR_APPEND,
191-
[
192-
'is_required' => true,
193-
'type' => 'multiselect',
194-
'options' => ['option 1' => 0, 'option 2' => 1, 'option 3']
195-
],
196-
[
197-
'product_type' => 'any',
198-
'attribute_code' => 'Option 1|Option 2|Option 1',
199-
'additional_attributes' => 'test_attribute=any,attribute_code=Option 1|Option 2|Option 1'
200-
],
184+
['is_required' => true, 'type' => 'multiselect',
185+
'options' => ['option 1' => 0, 'option 2' => 1, 'option 3']],
186+
['product_type' => 'any', 'attribute_code' => 'Option 1|Option 2|Option 1'],
201187
false
202188
],
203189
[
204190
Import::BEHAVIOR_APPEND,
205-
[
206-
'is_required' => true, 'type' => 'multiselect',
207-
'options' => ['option 1' => 0, 'option 2' => 1, 'option 3']
208-
],
209-
[
210-
'product_type' => 'any',
211-
'attribute_code' => 'Option 3|Option 3|Option 3|Option 1',
212-
'additional_attributes' => 'test_attribute=any,attribute_code=Option 3|Option 3|Option 3|Option 1'
213-
],
191+
['is_required' => true, 'type' => 'multiselect',
192+
'options' => ['option 1' => 0, 'option 2' => 1, 'option 3']],
193+
['product_type' => 'any', 'attribute_code' => 'Option 3|Option 3|Option 3|Option 1'],
214194
false
215195
],
216196
[
217197
Import::BEHAVIOR_APPEND,
218198
['is_required' => true, 'type' => 'multiselect', 'options' => ['option 1' => 0]],
219-
[
220-
'product_type' => 'any',
221-
'attribute_code' => 'Option 1|Option 1|Option 1|Option 1',
222-
'additional_attributes' => 'test_attribute=any,attribute_code=Option 1|Option 1|Option 1|Option 1'
223-
],
199+
['product_type' => 'any', 'attribute_code' => 'Option 1|Option 1|Option 1|Option 1'],
224200
false
225201
],
226202
[

app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,7 +1471,7 @@ public function testGetImagesFromRow($rowData, $expectedResult): void
14711471
*/
14721472
public function testParseAttributesWithoutWrappedValuesWillReturnsLowercasedAttributeCodes(): void
14731473
{
1474-
$attributesData = 'PARAM1=value1,param2=value2';
1474+
$attributesData = 'PARAM1=value1,param2=value2|value3';
14751475
$preparedAttributes = $this->invokeMethod(
14761476
$this->importProduct,
14771477
'parseAttributesWithoutWrappedValues',
@@ -1482,7 +1482,8 @@ public function testParseAttributesWithoutWrappedValuesWillReturnsLowercasedAttr
14821482
$this->assertEquals('value1', $preparedAttributes['param1']);
14831483

14841484
$this->assertArrayHasKey('param2', $preparedAttributes);
1485-
$this->assertEquals('value2', $preparedAttributes['param2']);
1485+
$this->assertTrue(in_array('value2', $preparedAttributes['param2']));
1486+
$this->assertTrue(in_array('value3', $preparedAttributes['param2']));
14861487

14871488
$this->assertArrayNotHasKey('PARAM1', $preparedAttributes);
14881489
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ public function testValidateMultiselectValuesWithCustomSeparator(): void
392392
$params = [
393393
'behavior' => Import::BEHAVIOR_ADD_UPDATE,
394394
'entity' => 'catalog_product',
395-
Import::FIELD_FIELD_MULTIPLE_VALUE_SEPARATOR => '###'
395+
Import::FIELD_FIELD_MULTIPLE_VALUE_SEPARATOR => '|||'
396396
];
397397

398398
$errors = $this->_model->setParameters($params)
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
sku,store_view_code,product_type,name,price,additional_attributes
2-
simple_ms_2,,simple,"With Multiselect 2",10,"multiselect_attribute=Option 2###Option 3"
2+
simple_ms_2,,simple,"With Multiselect 2",10,"multiselect_attribute=Option 2|||Option 3"

0 commit comments

Comments
 (0)