Skip to content

Commit e7deac0

Browse files
committed
MC-37006: Adding/removing disabled products to Magento flushes categories cache
1 parent 2f54dc2 commit e7deac0

File tree

5 files changed

+45
-13
lines changed

5 files changed

+45
-13
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ public function execute()
141141
$canSaveCustomOptions = $product->getCanSaveCustomOptions();
142142
$product->save();
143143
$this->handleImageRemoveError($data, $product->getId());
144+
$this->categoryLinkManagement->assignProductToCategories(
145+
$product->getSku(),
146+
$product->getCategoryIds()
147+
);
144148
$productId = $product->getEntityId();
145149
$productAttributeSetId = $product->getAttributeSetId();
146150
$productTypeId = $product->getTypeId();

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,6 +2358,22 @@ public function getImage()
23582358
return parent::getImage();
23592359
}
23602360

2361+
/**
2362+
* Get identities for related to product categories
2363+
*
2364+
* @param array $categoryIds
2365+
* @return array
2366+
*/
2367+
private function getProductCategoryIdentities(array $categoryIds): array
2368+
{
2369+
$identities = [];
2370+
foreach ($categoryIds as $categoryId) {
2371+
$identities[] = self::CACHE_PRODUCT_CATEGORY_TAG . '_' . $categoryId;
2372+
}
2373+
2374+
return $identities;
2375+
}
2376+
23612377
/**
23622378
* Get identities
23632379
*
@@ -2370,15 +2386,17 @@ public function getIdentities()
23702386
$isStatusChanged = $this->getOrigData(self::STATUS) != $this->getData(self::STATUS) && !$this->isObjectNew();
23712387
if ($isStatusChanged || $this->getStatus() == Status::STATUS_ENABLED) {
23722388
if ($this->getIsChangedCategories()) {
2373-
foreach ($this->getAffectedCategoryIds() as $categoryId) {
2374-
$identities[] = self::CACHE_PRODUCT_CATEGORY_TAG . '_' . $categoryId;
2375-
}
2389+
$identities = array_merge(
2390+
$identities,
2391+
$this->getProductCategoryIdentities($this->getAffectedCategoryIds())
2392+
);
23762393
}
23772394

23782395
if ($isStatusChanged || $this->isStockStatusChanged()) {
2379-
foreach ($this->getCategoryIds() as $categoryId) {
2380-
$identities[] = self::CACHE_PRODUCT_CATEGORY_TAG . '_' . $categoryId;
2381-
}
2396+
$identities = array_merge(
2397+
$identities,
2398+
$this->getProductCategoryIdentities($this->getCategoryIds())
2399+
);
23822400
}
23832401
}
23842402

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ protected function setUp(): void
125125
{
126126
$this->objectManager = new ObjectManager($this);
127127
$this->productLinkFactoryMock = $this->getMockBuilder(ProductLinkInterfaceFactory::class)
128-
->onlyMethods(['create'])
128+
->setMethods(['create'])
129129
->disableOriginalConstructor()
130130
->getMock();
131131
$this->productRepositoryMock = $this->createMock(ProductRepository::class);
@@ -149,12 +149,14 @@ protected function setUp(): void
149149
)
150150
->disableOriginalConstructor()
151151
->getMockForAbstractClass();
152-
$productExtensionAttributes = $this->createMock(ProductExtensionInterface::class);
152+
$productExtensionAttributes = $this->getMockBuilder(ProductExtensionInterface::class)
153+
->setMethods(['getCategoryLinks', 'setCategoryLinks'])
154+
->getMockForAbstractClass();
153155
$this->productMock->setExtensionAttributes($productExtensionAttributes);
154156

155157
$this->customOptionFactoryMock = $this->getMockBuilder(ProductCustomOptionInterfaceFactory::class)
156158
->disableOriginalConstructor()
157-
->onlyMethods(['create'])
159+
->setMethods(['create'])
158160
->getMock();
159161
$this->productLinksMock = $this->createMock(ProductLinks::class);
160162
$this->linkTypeProviderMock = $this->createMock(LinkTypeProvider::class);
@@ -167,11 +169,11 @@ protected function setUp(): void
167169
$this->dateTimeFilterMock = $this->createMock(DateTime::class);
168170

169171
$categoryLinkFactoryMock = $this->getMockBuilder(CategoryLinkInterfaceFactory::class)
170-
->onlyMethods(['create'])
172+
->setMethods(['create'])
171173
->disableOriginalConstructor()
172174
->getMock();
173175
$categoryLinkFactoryMock->method('create')
174-
->willReturnCallback(function() {
176+
->willReturnCallback(function () {
175177
return $this->createMock(CategoryLinkInterface::class);
176178
});
177179

dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/HelperTest.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function testInitializeCategoriesFromData(string $sku, array $categoryIds
4343

4444
$product = $this->initializationHelper->initializeFromData($product, $productData);
4545
$extensionAttributes = $product->getExtensionAttributes();
46-
$linkedCategoryIds = array_map(function(CategoryLinkInterface $categoryLink) {
46+
$linkedCategoryIds = array_map(function (CategoryLinkInterface $categoryLink) {
4747
return $categoryLink->getCategoryId();
4848
}, (array) $extensionAttributes->getCategoryLinks());
4949
$this->assertEquals($categoryIds, $linkedCategoryIds);
@@ -67,6 +67,10 @@ public function initializeCategoriesFromDataProvider(): array
6767
'simple-3',
6868
[10, 12, 13],
6969
],
70+
'change all categories' => [
71+
'simple-3',
72+
[4, 5]
73+
],
7074
'unassign all categories' => [
7175
'simple-3',
7276
[],

dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@
1212
$productRepository = $objectManager->create(
1313
\Magento\Catalog\Api\ProductRepositoryInterface::class
1414
);
15+
$categoryRepository = $objectManager->create(
16+
\Magento\Catalog\Api\CategoryRepositoryInterface::class
17+
);
1518

1619
$categoryLinkRepository = $objectManager->create(
1720
\Magento\Catalog\Api\CategoryLinkRepositoryInterface::class,
1821
[
19-
'productRepository' => $productRepository
22+
'productRepository' => $productRepository,
23+
'categoryRepository' => $categoryRepository,
2024
]
2125
);
2226

0 commit comments

Comments
 (0)