Próbuję zastąpić blok Topmenu w Magento 2.1, ale nie mogę znaleźć żadnego przewodnika. Wszystko, co znalazłem tutaj i gdzie indziej albo wydaje się dotyczyć tylko wersji 2.0, która wydaje się używać innej struktury folderów lub zawiera tylko częściowe przykłady kodu, które oczekują, że już znam ich właściwy kontekst (czego nie znam).
Moja bieżąca struktura folderów dla niestandardowego motywu to app/design/frontend/Vendor/theme_name. W ramach tego mam pliki rejestracji, temat, i kompozytor, a także foldery dla poszczególnych modułów, np Magento_Themei Magento_Search.
Z tego, co rozumiem, muszę zacząć od etc/di.xmlpliku takiego jak poniżej, edytowanego stąd :
<?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>
Rozumiem również, że następnym krokiem jest dodanie Block/Html/Topmenu.phppliku podobnego do poniższego (ponownie edytowanego z powyższego źródła):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Jednak nie jest dla mnie jasne, do czego powinienem użyć [Namespace]i [Module]gdzie umieścić te pliki. Próbowałem użyć nazwy dostawcy i motywu oraz umieszczenia folderów etci , a także umieszczenia ich , zmiany przestrzeni nazw na , ale żadne z nich nie ma żadnego efektu.Blockapp/design/frontend/Vendor/theme_nameapp/design/frontend/Vendor/theme_name/Magento_ThemeVendor\theme_name\Magento_Theme\Block\Html
Gdyby ktoś mógł wyjaśnić dokładnie, co muszę zrobić, aby zastąpić blok Topmenu (i wywnioskować dowolny inny blok) w wersji 2.1, byłbym bardzo wdzięczny.
Uzupełnienie
Próbowałem odpowiedzi Khoa TruongDinh , ale nie miało to wpływu. Użyłem następujących plików:
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__
);
Mam następnie usunięto zawartość pub/static/frontend, var/generationi var/view_preprocessed, i spłukuje cache Magento. W podmenu nie ma dodanej zamierzonej klasy „test”:
<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>
ulaby potwierdzić, że udało mi się zastąpić klasę Topmenu.