Saya mencoba untuk menimpa blok Topmenu di Magento 2.1 tetapi tidak dapat menemukan panduan untuk melakukannya. Semua yang saya temukan di sini dan di tempat lain tampaknya hanya berlaku untuk versi 2.0 yang tampaknya menggunakan struktur folder yang berbeda atau hanya memiliki contoh kode parsial yang mengharapkan saya sudah mengetahui konteks yang tepat (yang saya tidak tahu).
Struktur folder saya saat ini untuk tema khusus adalah app/design/frontend/Vendor/theme_name
. Dalam hal ini saya memiliki file pendaftaran, tema, dan komposer serta folder untuk berbagai modul, misalnya Magento_Theme
dan Magento_Search
.
Dari apa yang saya mengerti saya harus mulai dengan etc/di.xml
file seperti di bawah ini, diedit dari sini :
<?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>
Saya juga mengerti bahwa langkah selanjutnya adalah menambahkan Block/Html/Topmenu.php
file seperti di bawah ini (sekali lagi diedit dari sumber di atas):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Namun, tidak jelas bagi saya untuk apa saya harus menggunakan [Namespace]
dan [Module]
, atau di mana menempatkan file-file ini. Saya sudah mencoba menggunakan vendor dan nama tema, dan menempatkan folder etc
dan Block
di app/design/frontend/Vendor/theme_name
, serta menempatkan mereka app/design/frontend/Vendor/theme_name/Magento_Theme
, mengubah ruang nama Vendor\theme_name\Magento_Theme\Block\Html
, tetapi tidak ada efek.
Kalau ada yang bisa membantu menjelaskan dengan tepat apa yang harus saya lakukan untuk mengganti blok Topmenu (dan dengan kesimpulan blok lain) di versi 2.1 saya akan sangat dihargai.
Tambahan
Saya sudah mencoba jawaban Khoa TruongDinh tetapi tidak berpengaruh. Saya telah menggunakan file-file berikut:
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__
);
Aku sudah kemudian dihapus isi pub/static/frontend
, var/generation
dan var/view_preprocessed
, dan memerah cache Magento. Submenu tidak menambahkan kelas "tes" yang dimaksud:
<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
untuk mengonfirmasi bahwa saya telah berhasil menimpa kelas Topmenu.