Tôi đang cố gắng ghi đè khối Topmenu trong Magento 2.1 nhưng không thể tìm thấy bất kỳ hướng dẫn nào để làm như vậy. Mọi thứ tôi tìm thấy ở đây và những nơi khác dường như chỉ áp dụng cho phiên bản 2.0 dường như sử dụng cấu trúc thư mục khác hoặc chỉ có các ví dụ mã một phần mà tôi mong muốn biết được ngữ cảnh phù hợp của chúng (mà tôi không biết).
Cấu trúc thư mục hiện tại của tôi cho một chủ đề tùy chỉnh là app/design/frontend/Vendor/theme_name
. Trong phần này, tôi có các tệp đăng ký, chủ đề và trình soạn thảo cũng như các thư mục cho các mô-đun khác nhau, ví dụ Magento_Theme
và Magento_Search
.
Từ những gì tôi hiểu, tôi cần bắt đầu với một etc/di.xml
tệp như bên dưới, được chỉnh sửa từ đây :
<?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>
Tôi cũng hiểu rằng bước tiếp theo là thêm một Block/Html/Topmenu.php
tệp như bên dưới (một lần nữa được chỉnh sửa từ nguồn trên):
namespace [Namespace]\[Module]\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
}
}
Tuy nhiên, tôi không rõ tôi nên sử dụng cái gì [Namespace]
và [Module]
hoặc nơi để đặt các tệp này. Tôi đã thử sử dụng tên nhà cung cấp và chủ đề, và đặt etc
và Block
các thư mục vào app/design/frontend/Vendor/theme_name
, cũng như đặt chúng vào app/design/frontend/Vendor/theme_name/Magento_Theme
, sửa đổi các không gian tên thành Vendor\theme_name\Magento_Theme\Block\Html
, nhưng không có tác dụng.
Nếu bất cứ ai có thể giúp giải thích chính xác những gì tôi cần làm để ghi đè khối Topmenu (và bằng cách suy luận bất kỳ khối nào khác) trong phiên bản 2.1, tôi sẽ được đánh giá cao.
Phụ lục
Tôi đã thử câu trả lời của Khoa TruongDinh nhưng nó không ảnh hưởng gì. Tôi đã sử dụng các tệp sau:
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__
);
Sau đó tôi đã xóa nội dung của pub/static/frontend
,var/generation
và var/view_preprocessed
, và đỏ ửng bộ nhớ cache Magento. Menu con không có lớp "kiểm tra" dự định được thêm vào:
<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
để xác nhận rằng tôi đã vượt qua thành công lớp Topmenu.