Skip to content

Commit 377228f

Browse files
committed
MAGETWO-52583: Category products are not updated on storefront
1 parent f10c7c8 commit 377228f

File tree

3 files changed

+164
-0
lines changed

3 files changed

+164
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin;
8+
9+
use Magento\Catalog\Model\ResourceModel\Category as ResourceCategory;
10+
use Magento\Framework\Model\AbstractModel;
11+
12+
13+
class Category extends AbstractPlugin
14+
{
15+
/**
16+
* Reindex on product save
17+
*
18+
* @param ResourceCategory $resourceCategory
19+
* @param \Closure $proceed
20+
* @param AbstractModel $category
21+
* @return ResourceCategory
22+
* @throws \Exception
23+
*/
24+
public function aroundSave(ResourceCategory $resourceCategory, \Closure $proceed, AbstractModel $category)
25+
{
26+
return $this->addCommitCallback($resourceCategory, $proceed, $category);
27+
}
28+
29+
/**
30+
* @param ResourceCategory $resourceCategory
31+
* @param \Closure $proceed
32+
* @param AbstractModel $category
33+
* @return ResourceCategory
34+
* @throws \Exception
35+
*/
36+
private function addCommitCallback(ResourceCategory $resourceCategory, \Closure $proceed, AbstractModel $category)
37+
{
38+
try {
39+
$resourceCategory->beginTransaction();
40+
$result = $proceed($category);
41+
$resourceCategory->addCommitCallback(function () use ($category) {
42+
$affectedProducts = $category->getAffectedProductIds();
43+
if (is_array($affectedProducts)) {
44+
$this->reindexList($affectedProducts);
45+
}
46+
});
47+
$resourceCategory->commit();
48+
} catch (\Exception $e) {
49+
$resourceCategory->rollBack();
50+
throw $e;
51+
}
52+
53+
return $result;
54+
}
55+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CatalogSearch\Test\Unit\Model\Indexer\Fulltext\Plugin;
8+
9+
use Magento\Catalog\Model\Category as CategoryModel;
10+
use Magento\Catalog\Model\ResourceModel\Category as CategoryResourceModel;
11+
use Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Category as CategoryPlugin;
12+
use Magento\Framework\DB\Adapter\AdapterInterface;
13+
use Magento\Framework\Indexer\IndexerInterface;
14+
use Magento\Framework\Indexer\IndexerRegistry;
15+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
16+
17+
class CategoryTest extends \PHPUnit_Framework_TestCase
18+
{
19+
/**
20+
* @var \PHPUnit_Framework_MockObject_MockObject|IndexerInterface
21+
*/
22+
protected $indexerMock;
23+
24+
/**
25+
* @var \PHPUnit_Framework_MockObject_MockObject|CategoryResourceModel
26+
*/
27+
protected $categoryResourceMock;
28+
29+
/**
30+
* @var \PHPUnit_Framework_MockObject_MockObject|CategoryModel
31+
*/
32+
protected $categoryMock;
33+
34+
/**
35+
* @var \Closure
36+
*/
37+
protected $proceed;
38+
39+
/**
40+
* @var IndexerRegistry|\PHPUnit_Framework_MockObject_MockObject
41+
*/
42+
protected $indexerRegistryMock;
43+
44+
/**
45+
* @var CategoryPlugin
46+
*/
47+
protected $model;
48+
49+
protected function setUp()
50+
{
51+
$this->categoryMock = $this->getMockBuilder(CategoryModel::class)
52+
->disableOriginalConstructor()
53+
->getMock();
54+
$this->categoryResourceMock = $this->getMockBuilder(CategoryResourceModel::class)
55+
->disableOriginalConstructor()
56+
->getMock();
57+
$connection = $this->getMockBuilder(AdapterInterface::class)
58+
->disableOriginalConstructor()
59+
->getMockForAbstractClass();
60+
$this->categoryResourceMock->method('getConnection')->willReturn($connection);
61+
62+
$this->indexerMock = $this->getMockBuilder(IndexerInterface::class)
63+
->disableOriginalConstructor()
64+
->setMethods(['getId', 'getState', '__wakeup'])
65+
->getMockForAbstractClass();
66+
$this->indexerRegistryMock = $this->getMockBuilder(IndexerRegistry::class)
67+
->disableOriginalConstructor()
68+
->setMethods(['get'])
69+
->getMock();
70+
71+
$this->proceed = function () {
72+
return $this->categoryResourceMock;
73+
};
74+
75+
$this->model = (new ObjectManager($this))->getObject(
76+
CategoryPlugin::class,
77+
['indexerRegistry' => $this->indexerRegistryMock]
78+
);
79+
}
80+
81+
public function testAfterSaveNonScheduled()
82+
{
83+
$this->categoryResourceMock->expects($this->once())->method('addCommitCallback');
84+
$this->assertEquals(
85+
$this->categoryResourceMock,
86+
$this->model->aroundSave($this->categoryResourceMock, $this->proceed, $this->categoryMock)
87+
);
88+
}
89+
90+
public function testAfterSaveScheduled()
91+
{
92+
$this->categoryResourceMock->expects($this->once())->method('addCommitCallback');
93+
$this->assertEquals(
94+
$this->categoryResourceMock,
95+
$this->model->aroundSave($this->categoryResourceMock, $this->proceed, $this->categoryMock)
96+
);
97+
}
98+
99+
protected function prepareIndexer()
100+
{
101+
$this->indexerRegistryMock->expects($this->once())
102+
->method('get')
103+
->with(\Magento\CatalogSearch\Model\Indexer\Fulltext::INDEXER_ID)
104+
->will($this->returnValue($this->indexerMock));
105+
}
106+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
<type name="Magento\Catalog\Model\ResourceModel\Product">
4646
<plugin name="catalogsearchFulltextProduct" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Product"/>
4747
</type>
48+
<type name="Magento\Catalog\Model\ResourceModel\Category">
49+
<plugin name="catalogsearchFulltextCategory" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Category"/>
50+
</type>
4851
<type name="Magento\Catalog\Model\Product\Action">
4952
<plugin name="catalogsearchFulltextMassAction" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Product\Action"/>
5053
</type>

0 commit comments

Comments
 (0)