Sto cercando di ignorare il blocco Topmenu in Magento 2.1 ma non riesco a trovare alcuna guida per farlo. Tutto ciò che ho trovato qui e altrove sembra applicarsi solo alla versione 2.0 che sembra utilizzare una diversa struttura di cartelle o ha solo esempi di codice parziale che mi aspettano di conoscere già il loro contesto (cosa che non faccio).
La mia attuale struttura di cartelle per un tema personalizzato è app/design/frontend/Vendor/theme_name
. All'interno di questo ho i file di registrazione, tema e compositore, nonché le cartelle per i vari moduli, ad esempio Magento_Theme
e Magento_Search
.
Da quello che ho capito devo iniziare con un etc/di.xml
file come di seguito, modificato da qui :
<?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>
Capisco anche che il prossimo passo è aggiungere un Block/Html/Topmenu.php
file come il seguente (di nuovo modificato dalla fonte sopra):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Tuttavia, non mi è chiaro cosa dovrei usare per [Namespace]
e [Module]
, o dove posizionare questi file. Ho provato a utilizzare il nome del fornitore e del tema, a posizionare le cartelle etc
e , nonché a inserirle , modificando gli spazi dei nomi in , ma nessuno dei due ha alcun effetto.Block
app/design/frontend/Vendor/theme_name
app/design/frontend/Vendor/theme_name/Magento_Theme
Vendor\theme_name\Magento_Theme\Block\Html
Se qualcuno potesse aiutare a spiegare esattamente cosa devo fare per sovrascrivere il blocco Topmenu (e di conseguenza qualsiasi altro blocco) nella versione 2.1, sarei molto apprezzato.
appendice
Ho tentato la risposta di Khoa TruongDinh ma non ha avuto alcun effetto. Ho usato i seguenti file:
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__
);
Ho quindi rimosso il contenuto di pub/static/frontend
, var/generation
e var/view_preprocessed
, e arrossata la cache di Magento. Nel sottomenu non è stata aggiunta la classe "test" prevista:
<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
per confermare che ho superato con successo la classe Topmenu.