Skip to content

Commit ff86fb9

Browse files
author
Roman Ganin
committed
MAGETWO-33690: Category page displays outdated prices after catalog price rule is deleted
1 parent abc135c commit ff86fb9

File tree

7 files changed

+140
-202
lines changed

7 files changed

+140
-202
lines changed

app/code/Magento/Catalog/etc/di.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,6 @@
171171
<plugin name="catalogProductFlatIndexerStoreGroup" type="Magento\Catalog\Model\Indexer\Product\Flat\Plugin\StoreGroup" />
172172
<plugin name="categoryStoreGroupAroundSave" type="Magento\Catalog\Model\Indexer\Category\Product\Plugin\StoreGroup"/>
173173
</type>
174-
<type name="Magento\CatalogRule\Model\Indexer\AbstractIndexer">
175-
<plugin name="abstractIndexerAroundSave" type="Magento\PageCache\Model\Indexer\CatalogRulePlugin"/>
176-
</type>
177174
<type name="Magento\Customer\Api\GroupRepositoryInterface">
178175
<plugin name="invalidatePriceIndexerOnCustomerGroup" type="Magento\Catalog\Model\Indexer\Product\Price\Plugin\CustomerGroup"/>
179176
</type>

app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,22 @@ abstract class AbstractIndexer implements IndexerActionInterface, MviewActionInt
1616
*/
1717
protected $indexBuilder;
1818

19+
/**
20+
* Application Event Dispatcher
21+
*
22+
* @var \Magento\Framework\Event\ManagerInterface
23+
*/
24+
protected $_eventManager;
25+
1926
/**
2027
* @param IndexBuilder $indexBuilder
2128
*/
22-
public function __construct(IndexBuilder $indexBuilder)
23-
{
29+
public function __construct(
30+
IndexBuilder $indexBuilder,
31+
\Magento\Framework\Event\ManagerInterface $eventManager
32+
) {
2433
$this->indexBuilder = $indexBuilder;
34+
$this->_eventManager = $eventManager;
2535
}
2636

2737
/**
@@ -43,6 +53,20 @@ public function execute($ids)
4353
public function executeFull()
4454
{
4555
$this->indexBuilder->reindexFull();
56+
$this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $this]);
57+
}
58+
59+
/**
60+
* Get affected cache tags
61+
*
62+
* @return array
63+
*/
64+
public function getIdentities()
65+
{
66+
return [
67+
\Magento\Catalog\Model\Category::CACHE_TAG,
68+
\Magento\Catalog\Model\Product::CACHE_TAG
69+
];
4670
}
4771

4872
/**

app/code/Magento/CatalogRule/Model/Rule.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ class Rule extends \Magento\Rule\Model\AbstractModel
143143
*/
144144
protected $dateTime;
145145

146+
/**
147+
* @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor;
148+
*/
149+
protected $_ruleProductProcessor;
150+
146151
/**
147152
* @param \Magento\Framework\Model\Context $context
148153
* @param \Magento\Framework\Registry $registry
@@ -158,6 +163,7 @@ class Rule extends \Magento\Rule\Model\AbstractModel
158163
* @param \Magento\CatalogRule\Helper\Data $catalogRuleData
159164
* @param \Magento\Framework\App\Cache\TypeListInterface $cacheTypesList
160165
* @param \Magento\Framework\Stdlib\DateTime $dateTime
166+
* @param \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor
161167
* @param \Magento\Framework\Model\Resource\AbstractResource $resource
162168
* @param \Magento\Framework\Data\Collection\Db $resourceCollection
163169
* @param array $relatedCacheTypes
@@ -179,6 +185,7 @@ public function __construct(
179185
\Magento\CatalogRule\Helper\Data $catalogRuleData,
180186
\Magento\Framework\App\Cache\TypeListInterface $cacheTypesList,
181187
\Magento\Framework\Stdlib\DateTime $dateTime,
188+
\Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor $ruleProductProcessor,
182189
\Magento\Framework\Model\Resource\AbstractResource $resource = null,
183190
\Magento\Framework\Data\Collection\Db $resourceCollection = null,
184191
array $relatedCacheTypes = [],
@@ -195,6 +202,7 @@ public function __construct(
195202
$this->_cacheTypesList = $cacheTypesList;
196203
$this->_relatedCacheTypes = $relatedCacheTypes;
197204
$this->dateTime = $dateTime;
205+
$this->_ruleProductProcessor = $ruleProductProcessor;
198206
parent::__construct($context, $registry, $formFactory, $localeDate, $resource, $resourceCollection, $data);
199207
}
200208

@@ -445,4 +453,30 @@ protected function _invalidateCache()
445453
}
446454
return $this;
447455
}
456+
457+
/**
458+
* {@inheritdoc}
459+
*
460+
* @return $this
461+
*/
462+
public function afterSave()
463+
{
464+
if ($this->isObjectNew()) {
465+
$this->_ruleProductProcessor->reindexList($this->getMatchingProductIds());
466+
} else {
467+
$this->_ruleProductProcessor->getIndexer()->invalidate();
468+
}
469+
return parent::afterSave();
470+
}
471+
472+
/**
473+
* {@inheritdoc}
474+
*
475+
* @return $this
476+
*/
477+
public function afterDelete()
478+
{
479+
$this->_ruleProductProcessor->getIndexer()->invalidate();
480+
return parent::afterDelete();
481+
}
448482
}

app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/AbstractIndexerTest.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@ class AbstractIndexerTest extends \PHPUnit_Framework_TestCase
1818
*/
1919
protected $indexer;
2020

21+
/**
22+
* @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
23+
*/
24+
protected $_eventManagerMock;
25+
2126
protected function setUp()
2227
{
28+
$this->_eventManagerMock = $this->getMock('\Magento\Framework\Event\ManagerInterface');
2329
$this->indexBuilder = $this->getMock('Magento\CatalogRule\Model\Indexer\IndexBuilder', [], [], '', false);
2430

2531
$this->indexer = $this->getMockForAbstractClass(
2632
'Magento\CatalogRule\Model\Indexer\AbstractIndexer',
27-
[$this->indexBuilder]
33+
[
34+
$this->indexBuilder,
35+
$this->_eventManagerMock
36+
]
2837
);
2938
}
3039

@@ -39,6 +48,12 @@ public function testExecute()
3948
public function testExecuteFull()
4049
{
4150
$this->indexBuilder->expects($this->once())->method('reindexFull');
51+
$this->_eventManagerMock->expects($this->once())
52+
->method('dispatch')
53+
->with(
54+
'clean_cache_by_tags',
55+
['object' => $this->indexer]
56+
);
4257

4358
$this->indexer->executeFull();
4459
}

app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,26 @@ class RuleTest extends \PHPUnit_Framework_TestCase
3131
/** @var \Magento\Rule\Model\Condition\Combine|\PHPUnit_Framework_MockObject_MockObject */
3232
protected $condition;
3333

34+
/**
35+
* @var \Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor|\PHPUnit_Framework_MockObject_MockObject
36+
*/
37+
protected $_ruleProductProcessor;
38+
39+
/**
40+
* @var \Magento\Catalog\Model\Resource\Product\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
41+
*/
42+
protected $_productCollectionFactory;
43+
44+
/**
45+
* @var \Magento\Framework\Model\Resource\Iterator|\PHPUnit_Framework_MockObject_MockObject
46+
*/
47+
protected $_resourceIterator;
48+
49+
/**
50+
* @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject
51+
*/
52+
protected $productModel;
53+
3454
protected function setUp()
3555
{
3656
$this->storeManager = $this->getMock('Magento\Store\Model\StoreManagerInterface');
@@ -74,13 +94,39 @@ protected function setUp()
7494
'',
7595
false
7696
);
97+
$this->_ruleProductProcessor = $this->getMock(
98+
'\Magento\CatalogRule\Model\Indexer\Rule\RuleProductProcessor',
99+
[],
100+
[],
101+
'',
102+
false
103+
);
104+
105+
$this->_productCollectionFactory = $this->getMock(
106+
'\Magento\Catalog\Model\Resource\Product\CollectionFactory',
107+
['create'],
108+
[],
109+
'',
110+
false
111+
);
112+
113+
$this->_resourceIterator = $this->getMock(
114+
'\Magento\Framework\Model\Resource\Iterator',
115+
['walk'],
116+
[],
117+
'',
118+
false
119+
);
77120

78121
$this->objectManagerHelper = new ObjectManagerHelper($this);
79122
$this->rule = $this->objectManagerHelper->getObject(
80123
'Magento\CatalogRule\Model\Rule',
81124
[
82125
'storeManager' => $this->storeManager,
83-
'combineFactory' => $this->combineFactory
126+
'combineFactory' => $this->combineFactory,
127+
'ruleProductProcessor' => $this->_ruleProductProcessor,
128+
'productCollectionFactory' => $this->_productCollectionFactory,
129+
'resourceIterator' => $this->_resourceIterator,
84130
]
85131
);
86132
}
@@ -141,4 +187,21 @@ public function dataProviderCallbackValidateProduct()
141187
[true],
142188
];
143189
}
190+
191+
public function testAfterDelete()
192+
{
193+
$indexer = $this->getMock('\Magento\Indexer\Model\IndexerInterface');
194+
$indexer->expects($this->once())->method('invalidate');
195+
$this->_ruleProductProcessor->expects($this->once())->method('getIndexer')->will($this->returnValue($indexer));
196+
$this->rule->afterDelete();
197+
}
198+
199+
public function testAfterUpdate()
200+
{
201+
$this->rule->isObjectNew(false);
202+
$indexer = $this->getMock('\Magento\Indexer\Model\IndexerInterface');
203+
$indexer->expects($this->once())->method('invalidate');
204+
$this->_ruleProductProcessor->expects($this->once())->method('getIndexer')->will($this->returnValue($indexer));
205+
$this->rule->afterSave();
206+
}
144207
}

app/code/Magento/PageCache/Model/Indexer/CatalogRulePlugin.php

Lines changed: 0 additions & 74 deletions
This file was deleted.

0 commit comments

Comments
 (0)