Skip to content

Commit 04c2901

Browse files
committed
ACP2E-4057: The product import process encounters an error if a multi-select attribute is configured as required
1 parent 3026734 commit 04c2901

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,34 @@ public function isRequiredAttributeValid($attrCode, array $attributeParams, arra
194194
}
195195

196196
if ($doCheck === true) {
197-
return isset($rowData[$attrCode])
198-
&& strlen(trim($rowData[$attrCode]))
199-
&& trim($rowData[$attrCode]) !== $this->context->getEmptyAttributeValueConstant();
197+
return $this->validateRequiredAttributeValue($attrCode, $rowData);
200198
}
201199
return true;
202200
}
203201

202+
/**
203+
* Validate required attribute value for both array and string types.
204+
*
205+
* @param string $attrCode
206+
* @param array $rowData
207+
* @return bool
208+
*/
209+
private function validateRequiredAttributeValue(string $attrCode, array $rowData): bool
210+
{
211+
if (isset($rowData[$attrCode]) && is_array($rowData[$attrCode])) {
212+
$emptyConstant = $this->context->getEmptyAttributeValueConstant();
213+
$filteredArray = array_filter($rowData[$attrCode], function($value) {
214+
return !empty(trim($value));
215+
});
216+
return !empty($filteredArray)
217+
&& count($filteredArray) > 0
218+
&& !in_array($emptyConstant, array_map('trim', $rowData[$attrCode]), true);
219+
}
220+
return isset($rowData[$attrCode])
221+
&& strlen(trim($rowData[$attrCode]))
222+
&& trim($rowData[$attrCode]) !== $this->context->getEmptyAttributeValueConstant();
223+
}
224+
204225
/**
205226
* Is attribute valid
206227
*

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ protected function setUp(): void
5656
$entityTypeModel->expects($this->any())->method('retrieveAttributeFromCache')->willReturn([]);
5757
$this->context = $this->createPartialMock(
5858
Product::class,
59-
['retrieveProductTypeByName', 'retrieveMessageTemplate', 'getBehavior', 'getMultipleValueSeparator']
59+
['retrieveProductTypeByName', 'retrieveMessageTemplate', 'getBehavior', 'getMultipleValueSeparator', 'getEmptyAttributeValueConstant']
6060
);
6161
$this->context->expects($this->any())->method('retrieveProductTypeByName')->willReturn($entityTypeModel);
6262
$this->context->expects($this->any())->method('retrieveMessageTemplate')->willReturn('error message');
@@ -281,4 +281,38 @@ public function testInit()
281281
$this->validatorTwo->expects($this->once())->method('init');
282282
$this->validator->init(null);
283283
}
284+
285+
/**
286+
* Test required multi-select attribute validation with array values.
287+
*
288+
* @return void
289+
*/
290+
public function testIsRequiredAttributeValidWithMultiSelectArray()
291+
{
292+
$this->context->expects($this->any())->method('getBehavior')->willReturn(Import::BEHAVIOR_APPEND);
293+
$this->context->expects($this->any())->method('getEmptyAttributeValueConstant')->willReturn('__EMPTY__');
294+
$attrCode = 'required_multiselect_attribute';
295+
$attributeParams = ['is_required' => true];
296+
$rowData = [
297+
'product_type' => 'simple',
298+
'required_multiselect_attribute' => ['option1', 'option2']
299+
];
300+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
301+
$this->assertTrue($result);
302+
$rowData['required_multiselect_attribute'] = [];
303+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
304+
$this->assertFalse($result);
305+
$rowData['required_multiselect_attribute'] = ['option1', '', 'option2'];
306+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
307+
$this->assertTrue($result);
308+
$rowData['required_multiselect_attribute'] = ['option1', ' ', 'option2'];
309+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
310+
$this->assertTrue($result);
311+
$rowData['required_multiselect_attribute'] = ['option1', '__EMPTY__', 'option2'];
312+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
313+
$this->assertFalse($result);
314+
unset($rowData['required_multiselect_attribute']);
315+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
316+
$this->assertFalse($result);
317+
}
284318
}

0 commit comments

Comments
 (0)