Skip to content

Commit d1a13bf

Browse files
committed
MAGETWO-80502: Product set to one website resets incorrectly for all websites after special price scheduled update ends
1 parent c1b7710 commit d1a13bf

File tree

2 files changed

+57
-10
lines changed

2 files changed

+57
-10
lines changed

app/code/Magento/Catalog/Model/ProductRepository.php

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -292,27 +292,34 @@ protected function initializeProductData(array $productData, $createNew)
292292
foreach ($productData as $key => $value) {
293293
$product->setData($key, $value);
294294
}
295-
$this->assignProductToWebsites($product);
295+
$this->assignProductToWebsites($product, $createNew);
296296

297297
return $product;
298298
}
299299

300300
/**
301301
* @param \Magento\Catalog\Model\Product $product
302+
* @param bool $createNew
302303
* @return void
303304
*/
304-
private function assignProductToWebsites(\Magento\Catalog\Model\Product $product)
305+
private function assignProductToWebsites(\Magento\Catalog\Model\Product $product, $createNew)
305306
{
306-
if (!$this->storeManager->hasSingleStore()) {
307-
308-
if ($this->storeManager->getStore()->getCode() == \Magento\Store\Model\Store::ADMIN_CODE) {
309-
$websiteIds = array_keys($this->storeManager->getWebsites());
310-
} else {
311-
$websiteIds = [$this->storeManager->getStore()->getWebsiteId()];
312-
}
307+
$websiteIds = $product->getWebsiteIds();
308+
309+
if ($createNew && !$this->storeManager->hasSingleStore()) {
310+
$websiteIds = array_unique(
311+
array_merge(
312+
$websiteIds,
313+
[$this->storeManager->getStore()->getWebsiteId()]
314+
)
315+
);
316+
}
313317

314-
$product->setWebsiteIds(array_unique(array_merge($product->getWebsiteIds(), $websiteIds)));
318+
if ($createNew && $this->storeManager->getStore(true)->getCode() == \Magento\Store\Model\Store::ADMIN_CODE) {
319+
$websiteIds = array_keys($this->storeManager->getWebsites());
315320
}
321+
322+
$product->setWebsiteIds($websiteIds);
316323
}
317324

318325
/**

app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\Framework\Api\Data\ImageContentInterface;
1313
use Magento\Framework\Api\SortOrder;
1414
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
15+
use Magento\Store\Api\Data\StoreInterface;
1516

1617
/**
1718
* Tests \Magento\Catalog\Model\ProductRepositoryTest
@@ -1267,6 +1268,45 @@ public function testSaveExistingWithNewMediaGalleryEntries()
12671268
$this->model->save($this->productMock);
12681269
}
12691270

1271+
public function testSaveWithDifferentWebsites()
1272+
{
1273+
$getWebsitesResultData = [
1274+
1 => ['first'],
1275+
2 => ['second'],
1276+
3 => ['third']
1277+
];
1278+
$getWebsiteIdsResultData = [1,2,3];
1279+
$setWebsiteIdsResultData = [2,3];
1280+
$getIdBySkuResultData = 100;
1281+
$storeMock = $this->getMock(StoreInterface::class);
1282+
$this->resourceModelMock->expects($this->at(0))->method('getIdBySku')->will($this->returnValue(null));
1283+
$this->resourceModelMock
1284+
->expects($this->at(3))
1285+
->method('getIdBySku')
1286+
->will($this->returnValue($getIdBySkuResultData));
1287+
$this->productFactoryMock->expects($this->any())
1288+
->method('create')
1289+
->will($this->returnValue($this->productMock));
1290+
$this->initializationHelperMock->expects($this->never())->method('initialize');
1291+
$this->resourceModelMock->expects($this->once())->method('validate')->with($this->productMock)
1292+
->willReturn(true);
1293+
$this->resourceModelMock->expects($this->once())->method('save')->with($this->productMock)->willReturn(true);
1294+
$this->extensibleDataObjectConverterMock
1295+
->expects($this->once())
1296+
->method('toNestedArray')
1297+
->will($this->returnValue($this->productData));
1298+
$this->storeManagerMock->expects($this->any())
1299+
->method('getStore')
1300+
->willReturn($storeMock);
1301+
$this->storeManagerMock->expects($this->once())
1302+
->method('getWebsites')
1303+
->willReturn($getWebsitesResultData);
1304+
$this->productMock->expects($this->once())->method('getWebsiteIds')->willReturn($getWebsiteIdsResultData);
1305+
$this->productMock->expects($this->once())->method('setWebsiteIds')->willReturn($setWebsiteIdsResultData);
1306+
1307+
$this->assertEquals($this->productMock, $this->model->save($this->productMock));
1308+
}
1309+
12701310
public function testSaveExistingWithMediaGalleryEntries()
12711311
{
12721312
//update one entry, delete one entry

0 commit comments

Comments
 (0)