ฉันพยายามที่จะแทนที่บล็อก Topmenu ใน Magento 2.1 แต่ไม่สามารถหาคำแนะนำได้ ทุกสิ่งที่ฉันพบในที่นี้และที่อื่น ๆ ดูเหมือนว่าจะใช้เฉพาะกับเวอร์ชัน 2.0 ซึ่งดูเหมือนว่าจะใช้โครงสร้างโฟลเดอร์ที่แตกต่างกันหรือมีตัวอย่างโค้ดบางส่วนเท่านั้นซึ่งคาดว่าฉันจะรู้บริบทที่เหมาะสมของพวกเขาแล้ว
app/design/frontend/Vendor/theme_name
โครงสร้างโฟลเดอร์ของฉันปัจจุบันสำหรับธีมที่กำหนดเองคือ ภายในนี้ฉันมีการลงทะเบียนธีมและไฟล์แต่งเพลงเช่นเดียวกับโฟลเดอร์สำหรับโมดูลต่างๆเช่นและMagento_Theme
Magento_Search
จากสิ่งที่ฉันเข้าใจฉันต้องเริ่มต้นด้วย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="[Namespace]\[Module]\Block\Html\Topmenu" />
</config>
ฉันยังเข้าใจว่าขั้นตอนต่อไปคือการเพิ่มBlock/Html/Topmenu.php
ไฟล์เช่นด้านล่าง (แก้ไขอีกครั้งจากแหล่งที่มาด้านบน):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
อย่างไรก็ตามมันไม่ชัดเจนสำหรับฉันสิ่งที่ฉันควรใช้สำหรับ[Namespace]
และ[Module]
หรือที่จะวางไฟล์เหล่านี้ ฉันได้ลองใช้ผู้ขายและชื่อชุดรูปแบบและการวางetc
และBlock
โฟลเดอร์ในapp/design/frontend/Vendor/theme_name
รวมถึงการapp/design/frontend/Vendor/theme_name/Magento_Theme
แก้ไขการตั้งค่าเนมสเปซVendor\theme_name\Magento_Theme\Block\Html
แต่ไม่มีผลใด ๆ
หากใครสามารถช่วยอธิบายสิ่งที่ฉันต้องทำเพื่อแทนที่บล็อก Topmenu (และโดยการอนุมานบล็อกอื่น ๆ ) ในเวอร์ชัน 2.1 ฉันจะได้รับการชื่นชมมาก
ภาคผนวก
ฉันได้ลองคำตอบของKhoa TruongDinh แล้วแต่มันก็ไม่มีผลอะไร ฉันใช้ไฟล์ต่อไปนี้:
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__
);
ผมเคยเอาออกแล้วเนื้อหาของpub/static/frontend
, var/generation
และvar/view_preprocessed
และล้างแคชวีโอไอพี เมนูย่อยไม่มีคลาส "ทดสอบ" ที่ต้องการเพิ่ม:
<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
เพื่อยืนยันว่าฉันได้สำเร็จในชั้นเรียน Topmenu แล้ว