Skip to content

Commit 11fbc18

Browse files
committed
Merge remote-tracking branch 'origin/2.4-develop' into ACPT-752
2 parents 315c0a1 + 69a02ea commit 11fbc18

File tree

27 files changed

+415
-63
lines changed

27 files changed

+415
-63
lines changed

app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@ protected function _importData()
316316
} elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND == $this->getBehavior()) {
317317
$this->saveAdvancedPricing();
318318
}
319-
320319
return true;
321320
}
322321

@@ -342,7 +341,7 @@ public function deleteAdvancedPricing()
342341
{
343342
$this->_cachedSkuToDelete = null;
344343
$listSku = [];
345-
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
344+
while ($bunch = $this->_dataSourceModel->getNextUniqueBunch($this->getIds())) {
346345
foreach ($bunch as $rowNum => $rowData) {
347346
$this->validateRow($rowData, $rowNum);
348347
if (!$this->getErrorAggregator()->isRowInvalid($rowNum)) {
@@ -389,7 +388,7 @@ protected function saveAndReplaceAdvancedPrices()
389388
}
390389
$listSku = [];
391390
$tierPrices = [];
392-
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
391+
while ($bunch = $this->_dataSourceModel->getNextUniqueBunch($this->getIds())) {
393392
$bunchTierPrices = [];
394393
foreach ($bunch as $rowNum => $rowData) {
395394
if (!$this->validateRow($rowData, $rowNum)) {

app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ class AdvancedPricingTest extends AbstractImportTestCase
3939
/**
4040
* DB Table data
4141
*/
42-
const TABLE_NAME = 'tableName';
43-
const LINK_FIELD = 'linkField';
42+
public const TABLE_NAME = 'tableName';
43+
public const LINK_FIELD = 'linkField';
4444

4545
/**
4646
* @var ResourceFactory|MockObject
@@ -328,7 +328,7 @@ public function testSaveAndReplaceAdvancedPricesAddRowErrorCall(): void
328328
]
329329
];
330330
$this->dataSourceModel
331-
->method('getNextBunch')
331+
->method('getNextUniqueBunch')
332332
->willReturnOnConsecutiveCalls($testBunch);
333333
$this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(false);
334334
$this->advancedPricing->method('saveProductPrices')->willReturnSelf();
@@ -400,7 +400,7 @@ public function testSaveAndReplaceAdvancedPricesAppendBehaviourDataAndCalls(
400400
->method('getBehavior')
401401
->willReturn(Import::BEHAVIOR_APPEND);
402402
$this->dataSourceModel
403-
->method('getNextBunch')
403+
->method('getNextUniqueBunch')
404404
->willReturnOnConsecutiveCalls($data);
405405
$advancedPricing->method('validateRow')->willReturn(true);
406406

@@ -524,7 +524,7 @@ public function testSaveAndReplaceAdvancedPricesReplaceBehaviourInternalCalls():
524524
Import::BEHAVIOR_REPLACE
525525
);
526526
$this->dataSourceModel
527-
->method('getNextBunch')
527+
->method('getNextUniqueBunch')
528528
->willReturnOnConsecutiveCalls($data);
529529
$this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(true);
530530

@@ -577,7 +577,7 @@ public function testDeleteAdvancedPricingFormListSkuToDelete(): void
577577
];
578578

579579
$this->dataSourceModel
580-
->method('getNextBunch')
580+
->method('getNextUniqueBunch')
581581
->willReturnOnConsecutiveCalls($data);
582582
$this->advancedPricing->method('validateRow')->willReturn(true);
583583
$expectedSkuList = ['sku value'];

app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,9 @@ public function execute()
326326
return $this->returnResult('catalog/*/', [], ['error' => false]);
327327
} catch (\Exception $e) {
328328
$this->messageManager->addErrorMessage($e->getMessage());
329+
if ($attributeId === null) {
330+
unset($data['frontend_input']);
331+
}
329332
$this->_session->setAttributeData($data);
330333
return $this->returnResult(
331334
'catalog/*/edit',

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

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
use Magento\CatalogImportExport\Model\Import\Product\StatusProcessor;
1717
use Magento\CatalogImportExport\Model\Import\Product\StockProcessor;
1818
use Magento\CatalogImportExport\Model\StockItemImporterInterface;
19+
use Magento\CatalogImportExport\Model\StockItemProcessorInterface;
1920
use Magento\CatalogInventory\Api\Data\StockItemInterface;
2021
use Magento\Framework\App\Filesystem\DirectoryList;
2122
use Magento\Framework\App\ObjectManager;
2223
use Magento\Framework\Exception\LocalizedException;
2324
use Magento\Framework\Exception\NoSuchEntityException;
2425
use Magento\Framework\Filesystem;
2526
use Magento\Framework\Filesystem\Driver\File;
26-
use Magento\Framework\Filesystem\DriverPool;
2727
use Magento\Framework\Intl\DateTimeFactory;
2828
use Magento\Framework\Model\ResourceModel\Db\ObjectRelationProcessor;
2929
use Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface;
@@ -229,7 +229,6 @@ class Product extends AbstractEntity
229229
* @deprecated 101.1.0 use DI for LinkProcessor class if you want to add additional types
230230
*
231231
* @see Magento_CatalogImportExport::etc/di.xml
232-
*
233232
* @var array
234233
*/
235234
protected $_linkNameToId = [
@@ -615,8 +614,8 @@ class Product extends AbstractEntity
615614
/**
616615
* @var array
617616
* @deprecated 100.0.3
618-
* @since 100.0.3
619617
*
618+
* @since 100.0.3
620619
* @see we don't recommend this approach anymore
621620
*/
622621
protected $productUrlKeys = [];
@@ -756,6 +755,11 @@ class Product extends AbstractEntity
756755
*/
757756
private $linkProcessor;
758757

758+
/**
759+
* @var StockItemProcessorInterface
760+
*/
761+
private $stockItemProcessor;
762+
759763
/**
760764
* @param \Magento\Framework\Json\Helper\Data $jsonHelper
761765
* @param \Magento\ImportExport\Helper\Data $importExportData
@@ -805,6 +809,7 @@ class Product extends AbstractEntity
805809
* @param StockProcessor|null $stockProcessor
806810
* @param LinkProcessor|null $linkProcessor
807811
* @param File|null $fileDriver
812+
* @param StockItemProcessorInterface|null $stockItemProcessor
808813
* @throws LocalizedException
809814
* @throws \Magento\Framework\Exception\FileSystemException
810815
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -859,7 +864,8 @@ public function __construct(
859864
StatusProcessor $statusProcessor = null,
860865
StockProcessor $stockProcessor = null,
861866
LinkProcessor $linkProcessor = null,
862-
?File $fileDriver = null
867+
?File $fileDriver = null,
868+
?StockItemProcessorInterface $stockItemProcessor = null
863869
) {
864870
$this->_eventManager = $eventManager;
865871
$this->stockRegistry = $stockRegistry;
@@ -923,6 +929,8 @@ public function __construct(
923929
$this->dateTimeFactory = $dateTimeFactory ?? ObjectManager::getInstance()->get(DateTimeFactory::class);
924930
$this->productRepository = $productRepository ?? ObjectManager::getInstance()
925931
->get(ProductRepositoryInterface::class);
932+
$this->stockItemProcessor = $stockItemProcessor ?? ObjectManager::getInstance()
933+
->get(StockItemProcessorInterface::class);
926934
}
927935

928936
/**
@@ -1053,7 +1061,7 @@ protected function _deleteProducts()
10531061
{
10541062
$productEntityTable = $this->_resourceFactory->create()->getEntityTable();
10551063

1056-
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
1064+
while ($bunch = $this->_dataSourceModel->getNextUniqueBunch($this->getIds())) {
10571065
$idsToDelete = [];
10581066

10591067
foreach ($bunch as $rowNum => $rowData) {
@@ -1149,13 +1157,18 @@ protected function _saveProductsData()
11491157
foreach ($this->_productTypeModels as $productTypeModel) {
11501158
$productTypeModel->saveData();
11511159
}
1152-
$this->linkProcessor->saveLinks($this, $this->_dataSourceModel, $this->getProductEntityLinkField());
1160+
$this->linkProcessor->saveLinks(
1161+
$this,
1162+
$this->_dataSourceModel,
1163+
$this->getProductEntityLinkField(),
1164+
$this->getIds()
1165+
);
11531166
$this->_saveStockItem();
11541167
if ($this->_replaceFlag) {
11551168
$this->getOptionEntity()->clearProductsSkuToId();
11561169
}
1170+
$this->getOptionEntity()->setIds($this->getIds());
11571171
$this->getOptionEntity()->importData();
1158-
11591172
return $this;
11601173
}
11611174

@@ -1286,11 +1299,12 @@ protected function _prepareRowForDb(array $rowData)
12861299
*
12871300
* @deprecated 101.1.0 use linkProcessor Directly
12881301
* @see linkProcessor
1302+
*
12891303
* @return $this
12901304
*/
12911305
protected function _saveLinks()
12921306
{
1293-
$this->linkProcessor->saveLinks($this, $this->_dataSourceModel, $this->getProductEntityLinkField());
1307+
$this->linkProcessor->saveLinks($this, $this->_dataSourceModel, $this->getProductEntityLinkField(), []);
12941308
return $this;
12951309
}
12961310

@@ -1576,7 +1590,7 @@ protected function _saveProducts()
15761590
$productsQty = null;
15771591
$entityLinkField = $this->getProductEntityLinkField();
15781592

1579-
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
1593+
while ($bunch = $this->_dataSourceModel->getNextUniqueBunch($this->getIds())) {
15801594
$entityRowsIn = [];
15811595
$entityRowsUp = [];
15821596
$attributes = [];
@@ -1837,7 +1851,6 @@ protected function _saveProducts()
18371851
$mediaGalleryStoreData['disabled'] = 0;
18381852
$mediaGallery[Store::DEFAULT_STORE_ID][$rowSku][$uploadedFile] = $mediaGalleryStoreData;
18391853
}
1840-
18411854
}
18421855
}
18431856
}
@@ -2326,8 +2339,9 @@ protected function _saveProductWebsites(array $websiteData)
23262339
*/
23272340
protected function _saveStockItem()
23282341
{
2329-
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
2342+
while ($bunch = $this->_dataSourceModel->getNextUniqueBunch($this->getIds())) {
23302343
$stockData = [];
2344+
$importedData = [];
23312345
$productIdsToReindex = [];
23322346
$stockChangedProductIds = [];
23332347
// Format bunch to stock data rows
@@ -2353,12 +2367,13 @@ protected function _saveStockItem()
23532367

23542368
if (!isset($stockData[$sku])) {
23552369
$stockData[$sku] = $row;
2370+
$importedData[$sku] = $rowData;
23562371
}
23572372
}
23582373

23592374
// Insert rows
23602375
if (!empty($stockData)) {
2361-
$this->stockItemImporter->import($stockData);
2376+
$this->stockItemProcessor->process($stockData, $importedData);
23622377
}
23632378

23642379
$this->reindexStockStatus($stockChangedProductIds);
@@ -2463,7 +2478,7 @@ public function getNewSku($sku = null)
24632478
*/
24642479
public function getNextBunch()
24652480
{
2466-
return $this->_dataSourceModel->getNextBunch();
2481+
return $this->_dataSourceModel->getNextUniqueBunch($this->getIds());
24672482
}
24682483

24692484
/**
@@ -2512,6 +2527,7 @@ public function getRowScope(array $rowData)
25122527
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
25132528
* @SuppressWarnings(PHPMD.NPathComplexity)
25142529
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
2530+
* @throws \Zend_Validate_Exception
25152531
*/
25162532
public function validateRow(array $rowData, $rowNum)
25172533
{

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ public function __construct(
7878
* @param Product $importEntity
7979
* @param Data $dataSourceModel
8080
* @param string $linkField
81+
* @param array $ids
8182
* @return void
8283
* @throws LocalizedException
8384
*/
8485
public function saveLinks(
8586
Product $importEntity,
8687
Data $dataSourceModel,
87-
string $linkField
88+
string $linkField,
89+
array $ids
8890
): void {
8991
$resource = $this->linkFactory->create();
9092
$mainTable = $resource->getMainTable();
@@ -101,7 +103,7 @@ public function saveLinks(
101103
$bind = [':link_id' => $linkId, ':position' => 'position'];
102104
$positionAttrId[$linkId] = $importEntity->getConnection()->fetchOne($select, $bind);
103105
}
104-
while ($bunch = $dataSourceModel->getNextBunch()) {
106+
while ($bunch = $dataSourceModel->getNextUniqueBunch($ids)) {
105107
$nextLinkId = $this->resourceHelper->getNextAutoincrement($mainTable);
106108
$this->processLinkBunches($importEntity, $linkField, $bunch, $resource, $nextLinkId, $positionAttrId);
107109
}
@@ -111,6 +113,7 @@ public function saveLinks(
111113
* Add link types (exists for backwards compatibility)
112114
*
113115
* @deprecated 101.1.0 Use DI to inject to the constructor
116+
* @see Nothing
114117
* @param array $nameToIds
115118
*/
116119
public function addNameToIds(array $nameToIds): void

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ protected function _importData()
12561256
$prevOptionId = 0;
12571257
$optionId = null;
12581258
$valueId = null;
1259-
while ($bunch = $this->_dataSourceModel->getNextBunch()) {
1259+
while ($bunch = $this->_dataSourceModel->getNextUniqueBunch($this->getIds())) {
12601260
$products = [];
12611261
$options = [];
12621262
$titles = [];
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogImportExport\Model;
9+
10+
class StockItemProcessor implements StockItemProcessorInterface
11+
{
12+
/**
13+
* @var StockItemImporterInterface
14+
*/
15+
private $stockItemImporter;
16+
17+
/**
18+
* @param StockItemImporterInterface $stockItemImporter
19+
*/
20+
public function __construct(
21+
StockItemImporterInterface $stockItemImporter
22+
) {
23+
$this->stockItemImporter = $stockItemImporter;
24+
}
25+
26+
/**
27+
* @inheritdoc
28+
*/
29+
public function process(array $stockData, array $importedData): void
30+
{
31+
$this->stockItemImporter->import($stockData);
32+
}
33+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogImportExport\Model;
9+
10+
use Magento\Framework\Exception\CouldNotSaveException;
11+
use Magento\Framework\Exception\InputException;
12+
use Magento\Framework\Validation\ValidationException;
13+
14+
interface StockItemProcessorInterface
15+
{
16+
/**
17+
* Handle Import of Stock Item Data
18+
*
19+
* @param array $stockData
20+
* @param array $importedData
21+
* @return void
22+
* @throws CouldNotSaveException
23+
* @throws InputException
24+
* @throws ValidationException
25+
*/
26+
public function process(array $stockData, array $importedData): void;
27+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public function testSaveLinks($expectedCallCount, $linkToNameId)
121121

122122
$dataSourceModel = $this->createMock(Data::class);
123123

124-
$this->linkProcessor->saveLinks($importEntity, $dataSourceModel, '_related_');
124+
$this->linkProcessor->saveLinks($importEntity, $dataSourceModel, '_related_', []);
125125
}
126126

127127
/**

0 commit comments

Comments
 (0)