Ich versuche, den Topmenu-Block in Magento 2.1 zu überschreiben, finde aber keine Anleitung dazu. Alles, was ich hier und anderswo gefunden habe, scheint entweder nur auf Version 2.0 zuzutreffen, die anscheinend eine andere Ordnerstruktur verwendet, oder es gibt nur teilweise Codebeispiele, von denen ich erwartet habe, dass ich den richtigen Kontext bereits kenne (was ich nicht tue).
Meine aktuelle Ordnerstruktur für ein benutzerdefiniertes Thema ist app/design/frontend/Vendor/theme_name
. Darin befinden sich die Registrierungs-, Themen- und Komponistendateien sowie Ordner für die verschiedenen Module, z . B. Magento_Theme
und Magento_Search
.
Soweit ich weiß, muss ich mit einer etc/di.xml
Datei wie der folgenden beginnen, die von hier aus bearbeitet wurde :
<?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>
Ich verstehe auch, dass der nächste Schritt darin besteht, eine Block/Html/Topmenu.php
Datei wie die folgende hinzuzufügen (erneut bearbeitet aus der obigen Quelle):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Mir ist jedoch nicht klar, wofür [Namespace]
und [Module]
wo ich diese Dateien ablegen soll. Ich habe versucht , den Hersteller und Themennamen und die Platzierung etc
und Block
in Ordnern app/design/frontend/Vendor/theme_name
, sowie sie bei der Platzierung app/design/frontend/Vendor/theme_name/Magento_Theme
, zur Änderung der Namensräume Vendor\theme_name\Magento_Theme\Block\Html
, aber weder irgendeine Wirkung hat.
Wenn jemand helfen könnte, genau zu erklären, was ich tun muss, um den Topmenu-Block (und durch Rückschluss auf einen anderen Block) in Version 2.1 zu überschreiben, wäre ich sehr dankbar.
Nachtrag
Ich habe versucht, Khoa TruongDinhs Antwort zu geben, aber sie hatte keine Auswirkungen. Ich habe die folgenden Dateien verwendet:
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__
);
Ich habe dann den Inhalt entfernt pub/static/frontend
, var/generation
und var/view_preprocessed
, und die Magento Cache geleert. Dem Untermenü wurde nicht die beabsichtigte "Test" -Klasse hinzugefügt:
<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
zu bestätigen, dass ich die Klasse "Topmenu" erfolgreich überschrieben habe.