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_Theme
i Magento_Search
.
Z tego, co rozumiem, muszę zacząć od etc/di.xml
pliku 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.php
pliku 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 etc
i , a także umieszczenia ich , zmiany przestrzeni nazw na , ale żadne z nich nie ma żadnego efektu.Block
app/design/frontend/Vendor/theme_name
app/design/frontend/Vendor/theme_name/Magento_Theme
Vendor\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/generation
i 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>
ul
aby potwierdzić, że udało mi się zastąpić klasę Topmenu.