[संपादित करें]
जाहिर है, एम 2 के नवीनतम संस्करणों में यह काम नहीं करता है।
इसे इंगित करने के लिए अधिकतम करने के लिए धन्यवाद।
बाद के संस्करण के लिए आपको Magento\Theme\Block\Html\Topmenu
एक पर्यवेक्षक के बजाय एक प्लगइन जोड़ने की आवश्यकता है ।
इसमें जोड़ेंetc/frontend/di.xml
<type name="Magento\Theme\Block\Html\Topmenu">
<plugin name="[module]-topmenu" type="[Namespace]\[Module]\Plugin\Block\Topmenu" />
</type>
और प्लगइन वर्ग फ़ाइल बनाएँ [Namespace]/[Module]/Plugin/Block/Topmenu.php
<?php
namespace [Namespace]\[Module]\Plugin\Block;
use Magento\Framework\Data\Tree\NodeFactory;
class Topmenu
{
/**
* @var NodeFactory
*/
protected $nodeFactory;
public function __construct(
NodeFactory $nodeFactory
) {
$this->nodeFactory = $nodeFactory;
}
public function beforeGetHtml(
\Magento\Theme\Block\Html\Topmenu $subject,
$outermostClass = '',
$childrenWrapClass = '',
$limit = 0
) {
$node = $this->nodeFactory->create(
[
'data' => $this->getNodeAsArray(),
'idField' => 'id',
'tree' => $subject->getMenu()->getTree()
]
);
$subject->getMenu()->addChild($node);
}
protected function getNodeAsArray()
{
return [
'name' => __('Label goes here'),
'id' => 'some-unique-id-here',
'url' => 'http://www.example.com/',
'has_active' => false,
'is_active' => false // (expression to determine if menu item is selected or not)
];
}
}
[/ EDIT]
मूल उत्तर:
आप इवेंट का उपयोग करके शीर्ष मेनू में तत्व जोड़ सकते हैं page_block_html_topmenu_gethtml_before
।
तो आपको इन फाइलों के साथ एक मॉड्यूल बनाने की जरूरत है (सभी फाइलें अंदर होनी चाहिए app/code/[Namespace]/[Module]
):
etc/module.xml
- मॉड्यूल घोषणा फ़ाइल
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="[Namespace]_[Module]" setup_version="2.0.0">
<sequence>
<module name="Magento_Theme"/>
</sequence>
</module>
</config>
registration.php
- पंजीकरण फ़ाइल
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'[Namespace]_[Module]',
__DIR__
);
etc/frontend/events.xml
- घटनाओं घोषणा फ़ाइल
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="page_block_html_topmenu_gethtml_before">
<observer name="[namespace]_[module]_observer" instance="[Namespace]\[Module]\Observer\Topmenu" />
</event>
</config>
Observer/Topmenu.php
- वास्तविक पर्यवेक्षक
<?php
namespace [Namespace]\[Module]\Observer;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Data\Tree\Node;
use Magento\Framework\Event\ObserverInterface;
class Topmenu implements ObserverInterface
{
public function __construct(
...//add dependencies here if needed
)
{
...
}
/**
* @param EventObserver $observer
* @return $this
*/
public function execute(EventObserver $observer)
{
/** @var \Magento\Framework\Data\Tree\Node $menu */
$menu = $observer->getMenu();
$tree = $menu->getTree();
$data = [
'name' => __('Menu item label here'),
'id' => 'some-unique-id-here',
'url' => 'url goes here',
'is_active' => (expression to determine if menu item is selected or not)
];
$node = new Node($data, 'id', $tree, $menu);
$menu->addChild($node);
return $this;
}
}
अब php bin/magento setup:upgrade
मॉड्यूल को स्थापित करने के लिए क्ली में चलाएं और आप जाने के लिए अच्छे हैं।