J'essaie de remplacer le bloc Topmenu dans Magento 2.1 mais je ne trouve aucun guide pour le faire. Tout ce que j'ai trouvé ici et ailleurs semble ne s'appliquer qu'à la version 2.0 qui semble utiliser une structure de dossiers différente ou n'a que des exemples de code partiel qui m'attendent à connaître déjà leur contexte approprié (ce que je ne sais pas).
Ma structure de dossiers actuelle pour un thème personnalisé est app/design/frontend/Vendor/theme_name
. Dans ce document, j'ai les fichiers d'enregistrement, de thème et de compositeur ainsi que des dossiers pour les différents modules, par exemple Magento_Theme
et Magento_Search
.
D'après ce que je comprends, je dois commencer avec un etc/di.xml
fichier comme ci-dessous, édité à partir d' ici :
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Theme\Block\Html\Topmenu" type="[Namespace]\[Module]\Block\Html\Topmenu" />
</config>
Je comprends également que l'étape suivante consiste à ajouter un Block/Html/Topmenu.php
fichier comme celui ci-dessous (à nouveau modifié à partir de la source ci-dessus):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Cependant, il n'est pas clair pour moi à quoi je dois utiliser [Namespace]
et [Module]
, ou où placer ces fichiers. J'ai essayé d'utiliser le nom du fournisseur et du thème, et de placer les dossiers etc
et , ainsi que de les placer, en modifiant les espaces de noms , mais aucun n'a d'effet.Block
app/design/frontend/Vendor/theme_name
app/design/frontend/Vendor/theme_name/Magento_Theme
Vendor\theme_name\Magento_Theme\Block\Html
Si quelqu'un pouvait aider à expliquer exactement ce que je dois faire pour remplacer le bloc Topmenu (et par déduction tout autre bloc) dans la version 2.1, je serais très apprécié.
Addenda
J'ai essayé la réponse de Khoa TruongDinh mais cela n'a eu aucun effet. J'ai utilisé les fichiers suivants:
app/code/Vendor/MagentoTheme/Block/Html/Topmenu.php
<?php
namespace Vendor\MagentoTheme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
$html = '';
if (!$child->hasChildren())
{
return $html;
}
$colStops = null;
if ($childLevel == 0 && $limit)
{
$colStops = $this->_columnBrake($child->getChildren(), $limit);
}
// Added "test" class to test
$html .= '<ul class="level' . $childLevel . ' test submenu">';
$html .= $this->_getHtml($child, $childrenWrapClass, $limit, $colStops);
$html .= '</ul>';
return $html;
}
}
app/code/Vendor/MagentoTheme/composer.json
{
"name": "vendor/magento-theme",
"description": "",
"require": {
"php": "~5.5.0|~5.6.0|~7.0.0",
"magento/framework": "100.0.*"
},
"type": "magento2-module",
"version": "100.0.1",
"license": [
"OSL-3.0",
"AFL-3.0"
],
"autoload": {
"files": [ "registration.php" ],
"psr-4": {
"Vendor\\MagentoTheme\\": ""
}
}
}
app/code/Vendor/MagentoTheme/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Theme\Block\Html\Topmenu" type="Vendor\MagentoTheme\Block\Html\Topmenu" />
</config>
app/code/Vendor/MagentoTheme/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="Vendor_MagentoTheme" setup_version="1.0.0"></module>
</config>
app/code/Vendor/MagentoTheme/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_MagentoTheme',
__DIR__
);
Je l' ai ensuite retiré le contenu pub/static/frontend
, var/generation
et var/view_preprocessed
, et rincée le cache Magento. Le sous-menu n'a pas la classe "test" prévue ajoutée:
<ul class="level0 submenu ui-menu ui-widget ui-widget-content ui-corner-all" role="menu" aria-expanded="false" style="display: none; top: 52.6719px; left: 487.5px;" aria-hidden="true">...</ul>
ul
pour confirmer que j'ai réussi à remplacer la classe Topmenu.