Skip to content

Commit a5262b0

Browse files
author
Korshenko, Oleksii(okorshenko)
committed
Merge pull request #522 from magento-api/for-pr
[API] Bug Fixes
2 parents 6867bc4 + 95bc061 commit a5262b0

File tree

5 files changed

+63
-43
lines changed

5 files changed

+63
-43
lines changed

app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItemsObserver.php renamed to app/code/Magento/Catalog/Plugin/Block/Topmenu.php

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
* Copyright © 2016 Magento. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6-
namespace Magento\Catalog\Observer;
6+
namespace Magento\Catalog\Plugin\Block;
77

88
use Magento\Catalog\Model\Category;
99
use Magento\Framework\Data\Collection;
1010
use Magento\Framework\Data\Tree\Node;
11-
use Magento\Framework\Event\ObserverInterface;
1211

1312
/**
14-
* Observer that add Categories Tree to Topmenu
13+
* Plugin for top menu block
1514
*/
16-
class AddCatalogToTopmenuItemsObserver implements ObserverInterface
15+
class Topmenu
1716
{
1817
/**
1918
* Catalog category
@@ -38,11 +37,11 @@ class AddCatalogToTopmenuItemsObserver implements ObserverInterface
3837
private $layerResolver;
3938

4039
/**
40+
* Initialize dependencies.
41+
*
4142
* @param \Magento\Catalog\Helper\Category $catalogCategory
42-
* @param \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState
4343
* @param \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory
4444
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
45-
* @param \Magento\Catalog\Helper\Category $catalogCategory
4645
* @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
4746
*/
4847
public function __construct(
@@ -58,26 +57,27 @@ public function __construct(
5857
}
5958

6059
/**
61-
* Checking whether the using static urls in WYSIWYG allowed event
60+
* Build category tree for menu block.
6261
*
63-
* @param \Magento\Framework\Event\Observer $observer
62+
* @param \Magento\Theme\Block\Html\Topmenu $subject
63+
* @param string $outermostClass
64+
* @param string $childrenWrapClass
65+
* @param int $limit
6466
* @return void
67+
* @SuppressWarnings("PMD.UnusedFormalParameter")
6568
*/
66-
public function execute(\Magento\Framework\Event\Observer $observer)
67-
{
68-
$block = $observer->getEvent()->getBlock();
69-
$menuRootNode = $observer->getEvent()->getMenu();
70-
$block->addIdentity(Category::CACHE_TAG);
71-
69+
public function beforeGetHtml(
70+
\Magento\Theme\Block\Html\Topmenu $subject,
71+
$outermostClass = '',
72+
$childrenWrapClass = '',
73+
$limit = 0
74+
) {
7275
$rootId = $this->storeManager->getStore()->getRootCategoryId();
7376
$storeId = $this->storeManager->getStore()->getId();
74-
7577
/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
7678
$collection = $this->getCategoryTree($storeId, $rootId);
77-
7879
$currentCategory = $this->getCurrentCategory();
79-
80-
$mapping = [$rootId => $menuRootNode]; // use nodes stack to avoid recursion
80+
$mapping = [$rootId => $subject->getMenu()]; // use nodes stack to avoid recursion
8181
foreach ($collection as $category) {
8282
if (!isset($mapping[$category->getParentId()])) {
8383
continue;
@@ -94,8 +94,28 @@ public function execute(\Magento\Framework\Event\Observer $observer)
9494
$parentCategoryNode->addChild($categoryNode);
9595

9696
$mapping[$category->getId()] = $categoryNode; //add node in stack
97+
}
98+
}
9799

98-
$block->addIdentity(Category::CACHE_TAG . '_' . $category->getId());
100+
/**
101+
* Add list of associated identities to the top menu block for caching purposes.
102+
*
103+
* @param \Magento\Theme\Block\Html\Topmenu $subject
104+
* @return void
105+
*/
106+
public function beforeGetIdentities(\Magento\Theme\Block\Html\Topmenu $subject)
107+
{
108+
$subject->addIdentity(Category::CACHE_TAG);
109+
$rootId = $this->storeManager->getStore()->getRootCategoryId();
110+
$storeId = $this->storeManager->getStore()->getId();
111+
/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
112+
$collection = $this->getCategoryTree($storeId, $rootId);
113+
$mapping = [$rootId => $subject->getMenu()]; // use nodes stack to avoid recursion
114+
foreach ($collection as $category) {
115+
if (!isset($mapping[$category->getParentId()])) {
116+
continue;
117+
}
118+
$subject->addIdentity(Category::CACHE_TAG . '_' . $category->getId());
99119
}
100120
}
101121

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66

77
// @codingStandardsIgnoreFile
88

9-
namespace Magento\Catalog\Test\Unit\Observer;
9+
namespace Magento\Catalog\Test\Unit\Plugin\Block;
1010

1111
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
1212

13-
class AddCatalogToTopmenuItemsObserverTest extends \PHPUnit_Framework_TestCase
13+
class TopmenuTest extends \PHPUnit_Framework_TestCase
1414
{
1515
/**
16-
* @var \Magento\Catalog\Observer\AddCatalogToTopmenuItemsObserver
16+
* @var \Magento\Catalog\Plugin\Block\Topmenu
1717
*/
18-
protected $_observer;
18+
protected $block;
1919

2020
/**
2121
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Helper\Category
@@ -100,8 +100,8 @@ protected function setUp()
100100
$collection->expects($this->once())->method('getIterator')
101101
->willReturn(new \ArrayIterator([]));
102102

103-
$this->_observer = (new ObjectManager($this))->getObject(
104-
'Magento\Catalog\Observer\AddCatalogToTopmenuItemsObserver',
103+
$this->block = (new ObjectManager($this))->getObject(
104+
\Magento\Catalog\Plugin\Block\Topmenu::class,
105105
[
106106
'catalogCategory' => $this->_catalogCategory,
107107
'menuCategoryData' => $this->menuCategoryData,
@@ -142,23 +142,11 @@ protected function _preparationData()
142142
);
143143

144144
$blockMock = $this->_getCleanMock('\Magento\Theme\Block\Html\Topmenu');
145-
146-
$eventMock = $this->getMock('\Magento\Framework\Event', ['getBlock'], [], '', false);
147-
$eventMock->expects($this->once())
148-
->method('getBlock')
149-
->will($this->returnValue($blockMock));
150-
151-
$observerMock = $this->getMock('\Magento\Framework\Event\Observer', ['getEvent', 'getMenu'], [], '', false);
152-
$observerMock->expects($this->any())
153-
->method('getEvent')
154-
->will($this->returnValue($eventMock));
155-
156-
return $observerMock;
145+
return $blockMock;
157146
}
158147

159148
public function testAddCatalogToTopMenuItems()
160149
{
161-
$observer = $this->_preparationData();
162-
$this->_observer->execute($observer);
150+
$this->block->beforeGetHtml($this->_preparationData());
163151
}
164152
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
<type name="Magento\Customer\Model\ResourceModel\Visitor">
4747
<plugin name="catalogLog" type="Magento\Catalog\Model\Plugin\Log" />
4848
</type>
49+
<type name="Magento\Theme\Block\Html\Topmenu">
50+
<plugin name="catalogTopmenu" type="Magento\Catalog\Plugin\Block\Topmenu" />
51+
</type>
4952
<type name="Magento\Framework\Mview\View\StateInterface">
5053
<plugin name="setStatusForMview" type="Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState" />
5154
</type>

app/code/Magento/Catalog/etc/frontend/events.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,4 @@
1212
<event name="customer_logout">
1313
<observer name="catalog" instance="Magento\Catalog\Observer\Compare\BindCustomerLogoutObserver" shared="false" />
1414
</event>
15-
<event name="page_block_html_topmenu_gethtml_before">
16-
<observer name="catalog_add_topmenu_items" instance="Magento\Catalog\Observer\AddCatalogToTopmenuItemsObserver" />
17-
</event>
1815
</config>

app/code/Magento/Theme/Block/Html/Topmenu.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,9 @@ protected function _getMenuItemClasses(\Magento\Framework\Data\Tree\Node $item)
330330
*/
331331
public function addIdentity($identity)
332332
{
333-
$this->identities[] = $identity;
333+
if (!in_array($identity, $this->identities)) {
334+
$this->identities[] = $identity;
335+
}
334336
}
335337

336338
/**
@@ -364,4 +366,14 @@ protected function getCacheTags()
364366
{
365367
return array_merge(parent::getCacheTags(), $this->getIdentities());
366368
}
369+
370+
/**
371+
* Get menu object.
372+
*
373+
* @return Node
374+
*/
375+
public function getMenu()
376+
{
377+
return $this->_menu;
378+
}
367379
}

0 commit comments

Comments
 (0)