Skip to content

Commit 5106ec1

Browse files
committed
ACPT-1419: Import Products - multiple attributes
1 parent 077e25f commit 5106ec1

File tree

5 files changed

+78
-37
lines changed

5 files changed

+78
-37
lines changed

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

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,13 +1558,21 @@ public function getImagesFromRow(array $rowData)
15581558
$labels = [];
15591559
foreach ($this->_imagesArrayKeys as $column) {
15601560
if (!empty($rowData[$column])) {
1561-
$images[$column] = array_unique(
1562-
array_map(
1563-
'trim',
1564-
explode($this->getMultipleValueSeparator(), $rowData[$column])
1565-
)
1566-
);
1567-
1561+
if (is_string($rowData[$column])) {
1562+
$images[$column] = array_unique(
1563+
array_map(
1564+
'trim',
1565+
explode($this->getMultipleValueSeparator(), $rowData[$column])
1566+
)
1567+
);
1568+
} elseif (is_array($rowData[$column])) {
1569+
$images[$column] = array_unique(
1570+
array_map(
1571+
'trim',
1572+
$rowData[$column]
1573+
)
1574+
);
1575+
}
15681576
if (!empty($rowData[$column . '_label'])) {
15691577
$labels[$column] = $this->parseMultipleValues($rowData[$column . '_label']);
15701578

@@ -1765,7 +1773,12 @@ private function saveProductToWebsitePhase(array $rowData) : void
17651773
$this->websitesCache[$rowSku] = [];
17661774
}
17671775
if (!empty($rowData[self::COL_PRODUCT_WEBSITES])) {
1768-
$websiteCodes = explode($this->getMultipleValueSeparator(), $rowData[self::COL_PRODUCT_WEBSITES]);
1776+
$websiteCodes = is_string($rowData[self::COL_PRODUCT_WEBSITES])
1777+
? explode($this->getMultipleValueSeparator(), $rowData[self::COL_PRODUCT_WEBSITES])
1778+
: (is_array($rowData[self::COL_PRODUCT_WEBSITES])
1779+
? $rowData[self::COL_PRODUCT_WEBSITES]
1780+
: []);
1781+
17691782
foreach ($websiteCodes as $websiteCode) {
17701783
$websiteId = $this->storeResolver->getWebsiteCodeToId($websiteCode);
17711784
$this->websitesCache[$rowSku][$websiteId] = true;
@@ -2155,11 +2168,10 @@ private function getImagesHiddenStates($rowData)
21552168
*/
21562169
protected function processRowCategories($rowData)
21572170
{
2158-
$categoriesString = empty($rowData[self::COL_CATEGORY]) ? '' : $rowData[self::COL_CATEGORY];
21592171
$categoryIds = [];
2160-
if (!empty($categoriesString)) {
2172+
if (!empty($rowData[self::COL_CATEGORY])) {
21612173
$categoryIds = $this->categoryProcessor->upsertCategories(
2162-
$categoriesString,
2174+
$rowData[self::COL_CATEGORY],
21632175
$this->getMultipleValueSeparator()
21642176
);
21652177
foreach ($this->categoryProcessor->getFailedCategories() as $error) {

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

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
namespace Magento\CatalogImportExport\Model\Import\Product\Type;
77

88
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
9+
use Magento\CatalogImportExport\Model\Import\Product;
910
use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface;
1011
use Magento\Eav\Model\Entity\Attribute\Source\Table;
1112
use Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\CollectionFactory as AttributeOptionCollectionFactory;
@@ -110,7 +111,7 @@ abstract class AbstractType
110111
/**
111112
* Product entity object.
112113
*
113-
* @var \Magento\CatalogImportExport\Model\Import\Product
114+
* @var Product
114115
*/
115116
protected $_entityModel;
116117

@@ -189,7 +190,7 @@ public function __construct(
189190
if (!isset($params[0])
190191
|| !isset($params[1])
191192
|| !is_object($params[0])
192-
|| !$params[0] instanceof \Magento\CatalogImportExport\Model\Import\Product
193+
|| !$params[0] instanceof Product
193194
) {
194195
throw new \Magento\Framework\Exception\LocalizedException(__('Please correct the parameters.'));
195196
}
@@ -258,7 +259,7 @@ public function retrieveAttribute($attributeCode, $attributeSet)
258259
protected function _getProductAttributes($attrSetData)
259260
{
260261
if (is_array($attrSetData)) {
261-
return $this->_attributes[$attrSetData[\Magento\CatalogImportExport\Model\Import\Product::COL_ATTR_SET]];
262+
return $this->_attributes[$attrSetData[Product::COL_ATTR_SET]];
262263
} else {
263264
return $this->_attributes[$attrSetData];
264265
}
@@ -569,23 +570,17 @@ public function isRowValid(array $rowData, $rowNum, $isNewProduct = true)
569570
{
570571
$error = false;
571572
$rowScope = $this->_entityModel->getRowScope($rowData);
572-
if (\Magento\CatalogImportExport\Model\Import\Product::SCOPE_NULL != $rowScope
573-
&& !empty($rowData[\Magento\CatalogImportExport\Model\Import\Product::COL_SKU])
574-
) {
573+
if (Product::SCOPE_NULL != $rowScope && !empty($rowData[Product::COL_SKU])) {
575574
foreach ($this->_getProductAttributes($rowData) as $attrCode => $attrParams) {
576575
// check value for non-empty in the case of required attribute?
577-
if (isset($rowData[$attrCode]) && strlen($rowData[$attrCode])) {
576+
if (isset($rowData[$attrCode]) && (!is_array($rowData[$attrCode]) && strlen($rowData[$attrCode]) > 0
577+
|| is_array($rowData[$attrCode]) && !empty($rowData[$attrCode]))) {
578578
$error |= !$this->_entityModel->isAttributeValid($attrCode, $attrParams, $rowData, $rowNum);
579579
} elseif ($this->_isAttributeRequiredCheckNeeded($attrCode) && $attrParams['is_required']) {
580580
// For the default scope - if this is a new product or
581581
// for an old product, if the imported doc has the column present for the attrCode
582-
if (\Magento\CatalogImportExport\Model\Import\Product::SCOPE_DEFAULT == $rowScope &&
583-
($isNewProduct ||
584-
array_key_exists(
585-
$attrCode,
586-
$rowData
587-
))
588-
) {
582+
if (Product::SCOPE_DEFAULT == $rowScope &&
583+
($isNewProduct || array_key_exists($attrCode, $rowData))) {
589584
$this->_entityModel->addRowError(
590585
RowValidatorInterface::ERROR_VALUE_IS_REQUIRED,
591586
$rowNum,
@@ -631,7 +626,8 @@ public function prepareAttributesWithDefaultValueForSave(array $rowData, $withDe
631626
continue;
632627
}
633628
$attrCode = mb_strtolower($attrCode);
634-
if (isset($rowData[$attrCode]) && strlen(trim($rowData[$attrCode]))) {
629+
if (isset($rowData[$attrCode]) && ((is_array($rowData[$attrCode]) && !empty($rowData[$attrCode]))
630+
|| (!is_array($rowData[$attrCode]) && strlen(trim($rowData[$attrCode]))))) {
635631
if (in_array($attrParams['type'], ['select', 'boolean'])) {
636632
$resultAttrs[$attrCode] = $attrParams['options'][strtolower($rowData[$attrCode])];
637633
} elseif ('multiselect' == $attrParams['type']) {

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,24 @@ public function isAttributeValid($attrCode, array $attrParams, array $rowData)
205205
return $valid;
206206
}
207207

208-
if ($rowData[$attrCode] === null || trim($rowData[$attrCode]) === '') {
209-
return true;
210-
}
208+
if (is_array($rowData[$attrCode])) {
209+
if (empty($rowData[$attrCode])) {
210+
return true;
211+
}
211212

212-
if ($rowData[$attrCode] === $this->context->getEmptyAttributeValueConstant() && !$attrParams['is_required']) {
213-
return true;
213+
foreach ($rowData[$attrCode] as $attrValue) {
214+
if ($attrValue === null || trim($attrValue) === '') {
215+
return true;
216+
}
217+
}
218+
} else {
219+
if ($rowData[$attrCode] === null || trim($rowData[$attrCode]) === '') {
220+
return true;
221+
}
222+
223+
if ($rowData[$attrCode] === $this->context->getEmptyAttributeValueConstant() && !$attrParams['is_required']) {
224+
return true;
225+
}
214226
}
215227

216228
$valid = false;
@@ -357,14 +369,20 @@ public function getRowScope(array $rowData)
357369
/**
358370
* Validate category names
359371
*
360-
* @param string $value
372+
* @param string|array $value
361373
* @return bool
362374
*/
363-
private function isCategoriesValid(string $value) : bool
375+
private function isCategoriesValid(string|array $value) : bool
364376
{
365377
$result = true;
366378
if ($value) {
367-
$values = explode($this->context->getMultipleValueSeparator(), $value);
379+
$values = [];
380+
if (is_string($value)) {
381+
$values = explode($this->context->getMultipleValueSeparator(), $value);
382+
} elseif (is_array($value)) {
383+
$values = $value;
384+
}
385+
368386
foreach ($values as $categoryName) {
369387
if ($result === true) {
370388
$result = $this->string->strlen($categoryName) < Product::DB_MAX_VARCHAR_LENGTH;

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,14 @@ public function isValid($value)
102102
}
103103
}
104104
}
105-
if (isset($value[self::ADDITIONAL_IMAGES]) && strlen($value[self::ADDITIONAL_IMAGES])) {
106-
foreach (explode($this->context->getMultipleValueSeparator(), $value[self::ADDITIONAL_IMAGES]) as $image) {
105+
if (isset($value[self::ADDITIONAL_IMAGES])) {
106+
$images = array_filter(
107+
is_array($value[self::ADDITIONAL_IMAGES])
108+
? $value[self::ADDITIONAL_IMAGES]
109+
: explode($this->context->getMultipleValueSeparator(), $value[self::ADDITIONAL_IMAGES])
110+
);
111+
112+
foreach ($images as $image) {
107113
if (!$this->checkPath($image) && !$this->validator->isValid($image)) {
108114
$this->_addMessages(
109115
[

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,16 @@ public function isValid($value)
3333
return true;
3434
}
3535
$separator = $this->context->getMultipleValueSeparator();
36-
$websites = explode($separator, $value[ImportProduct::COL_PRODUCT_WEBSITES]);
36+
37+
if (is_string($value[ImportProduct::COL_PRODUCT_WEBSITES])) {
38+
$websites = explode($separator, $value[ImportProduct::COL_PRODUCT_WEBSITES]);
39+
} elseif (is_array($value[ImportProduct::COL_PRODUCT_WEBSITES])) {
40+
$websites = $value[ImportProduct::COL_PRODUCT_WEBSITES];
41+
} else {
42+
$this->_addMessages([self::ERROR_INVALID_WEBSITE]);
43+
return false;
44+
}
45+
3746
foreach ($websites as $website) {
3847
if (!$this->storeResolver->getWebsiteCodeToId($website)) {
3948
$this->_addMessages([self::ERROR_INVALID_WEBSITE]);

0 commit comments

Comments
 (0)