Estoy tratando de anular el bloque Topmenu en Magento 2.1 pero no puedo encontrar ninguna guía para hacerlo. Todo lo que he encontrado aquí y en otros lugares parece aplicarse solo a la versión 2.0 que parece usar una estructura de carpetas diferente o solo tiene ejemplos de código parcial que espera que ya conozca su contexto adecuado (lo cual no sé).
Mi estructura de carpetas actual para un tema personalizado es app/design/frontend/Vendor/theme_name
. Dentro de esto tengo los archivos de registro, tema y compositor, así como carpetas para los diversos módulos, por ejemplo, Magento_Theme
y Magento_Search
.
Por lo que entiendo, necesito comenzar con un etc/di.xml
archivo como el siguiente, editado desde aquí :
<?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>
También entiendo que el siguiente paso es agregar un Block/Html/Topmenu.php
archivo como el siguiente (nuevamente editado de la fuente anterior):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Sin embargo, no me queda claro para qué debo usar [Namespace]
y [Module]
dónde colocar estos archivos. Intenté usar el nombre del proveedor y el tema, y colocar las carpetas etc
y , así como colocarlas , modificando los espacios de nombres , pero ninguno tiene ningún efecto.Block
app/design/frontend/Vendor/theme_name
app/design/frontend/Vendor/theme_name/Magento_Theme
Vendor\theme_name\Magento_Theme\Block\Html
Si alguien pudiera ayudarme a explicar exactamente lo que necesito hacer para anular el bloque Topmenu (y por inferencia cualquier otro bloque) en la versión 2.1, sería muy apreciado.
Apéndice
He intentado la respuesta de Khoa TruongDinh pero no ha tenido ningún efecto. He usado los siguientes archivos:
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__
);
Entonces me he quitado el contenido de pub/static/frontend
, var/generation
y var/view_preprocessed
, y tiraba el caché de Magento. El submenú no tiene la clase de "prueba" prevista agregada:
<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
para confirmar que he anulado con éxito la clase Topmenu.