[EDIT]
Apparemment, dans les dernières versions de M2, cela ne fonctionne plus.
Merci à Max de l'avoir signalé.
Pour une version ultérieure, vous devez ajouter un plugin pour Magento\Theme\Block\Html\Topmenu
au lieu d'un observateur.
Ajoutez ceci àetc/frontend/di.xml
<type name="Magento\Theme\Block\Html\Topmenu">
<plugin name="[module]-topmenu" type="[Namespace]\[Module]\Plugin\Block\Topmenu" />
</type>
et créer le fichier de classe de plugin [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]
Réponse originale:
Vous pouvez ajouter des éléments au menu supérieur en utilisant l'événement page_block_html_topmenu_gethtml_before
.
Vous devez donc créer un module avec ces fichiers (tous les fichiers doivent être dedans app/code/[Namespace]/[Module]
):
etc/module.xml
- le fichier de déclaration du module
<?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
- le dossier d'inscription
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'[Namespace]_[Module]',
__DIR__
);
etc/frontend/events.xml
- le fichier de déclaration des événements
<?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
- l'observateur réel
<?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;
}
}
Maintenant, exécutez dans le cli php bin/magento setup:upgrade
pour installer le module et vous êtes prêt à partir.