Skip to content

Commit aebc470

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

File tree

3 files changed

+27
-38
lines changed

3 files changed

+27
-38
lines changed

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

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

28732873
/**
@@ -2881,9 +2881,10 @@ private function getAdditionalAttributes($additionalAttributes)
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
28842885
* @return array
28852886
*/
2886-
private function parseAttributesWithoutWrappedValues($attributesData)
2887+
private function parseAttributesWithoutWrappedValues(string $attributesData, string $productType): array
28872888
{
28882889
$attributeNameValuePairs = explode($this->getMultipleValueSeparator(), $attributesData);
28892890
$preparedAttributes = [];
@@ -2899,7 +2900,21 @@ private function parseAttributesWithoutWrappedValues($attributesData)
28992900
}
29002901
list($code, $value) = explode(self::PAIR_NAME_VALUE_SEPARATOR, $attributeData, 2);
29012902
$code = mb_strtolower($code);
2902-
$preparedAttributes[$code] = $value;
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;
2917+
}
29032918
}
29042919
return $preparedAttributes;
29052920
}

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -633,19 +633,7 @@ public function prepareAttributesWithDefaultValueForSave(array $rowData, $withDe
633633
$resultAttrs[$attrCode] = $attrParams['options'][strtolower($rowData[$attrCode])];
634634
} elseif ('multiselect' == $attrParams['type']) {
635635
$resultAttrs[$attrCode] = [];
636-
$delimiter = '';
637-
if (is_string($rowData[$attrCode])
638-
&& str_contains($rowData[$attrCode], Product::PSEUDO_MULTI_LINE_SEPARATOR)) {
639-
if (!empty($rowData['additional_attributes'])
640-
&& str_contains(
641-
$rowData['additional_attributes'],
642-
$attrCode . Product::PAIR_NAME_VALUE_SEPARATOR
643-
)
644-
) {
645-
$delimiter = Product::PSEUDO_MULTI_LINE_SEPARATOR;
646-
}
647-
}
648-
foreach ($this->_entityModel->parseMultiselectValues($rowData[$attrCode], $delimiter) as $value) {
636+
foreach ($this->_entityModel->parseMultiselectValues($rowData[$attrCode]) as $value) {
649637
$resultAttrs[$attrCode][] = $attrParams['options'][strtolower($value)];
650638
}
651639
$resultAttrs[$attrCode] = implode(',', $resultAttrs[$attrCode]);

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

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -255,23 +255,11 @@ public function isAttributeValid($attrCode, array $attrParams, array $rowData)
255255
*/
256256
private function validateByAttributeType(string $attrCode, array $attrParams, array $rowData): bool
257257
{
258-
$delimiter = '';
259-
if (is_string($rowData[$attrCode]) && str_contains($rowData[$attrCode], Product::PSEUDO_MULTI_LINE_SEPARATOR)) {
260-
if (!empty($rowData['additional_attributes'])
261-
&& str_contains($rowData['additional_attributes'], $attrCode . Product::PAIR_NAME_VALUE_SEPARATOR)) {
262-
$delimiter = Product::PSEUDO_MULTI_LINE_SEPARATOR;
263-
}
264-
}
265258
return match ($attrParams['type']) {
266259
'varchar', 'text' => $this->textValidation($attrCode, $attrParams['type']),
267260
'decimal', 'int' => $this->numericValidation($attrCode, $attrParams['type']),
268261
'select', 'boolean' => $this->validateOption($attrCode, $attrParams['options'], $rowData[$attrCode]),
269-
'multiselect' => $this->validateMultiselect(
270-
$attrCode,
271-
$attrParams['options'],
272-
$rowData[$attrCode],
273-
$delimiter
274-
),
262+
'multiselect' => $this->validateMultiselect($attrCode, $attrParams['options'], $rowData[$attrCode]),
275263
'datetime' => $this->validateDateTime($rowData[$attrCode]),
276264
default => true,
277265
};
@@ -283,18 +271,16 @@ private function validateByAttributeType(string $attrCode, array $attrParams, ar
283271
* @param string $attrCode
284272
* @param array $options
285273
* @param array|string $rowData
286-
* @param string $delimiter
287274
* @return bool
288275
*/
289276
private function validateMultiselect(
290277
string $attrCode,
291278
array $options,
292-
array|string $rowData,
293-
string $delimiter = ''
279+
array|string $rowData
294280
): bool {
295281
$valid = true;
296282

297-
$values = $this->context->parseMultiselectValues($rowData, $delimiter);
283+
$values = $this->context->parseMultiselectValues($rowData);
298284
foreach ($values as $value) {
299285
$valid = $this->validateOption($attrCode, $options, $value);
300286
if (!$valid) {

0 commit comments

Comments
 (0)