Magento 2.1의 Topmenu 블록을 재정의하려고하는데 그렇게 할 수있는 가이드를 찾을 수 없습니다. 여기와 다른 곳에서 찾은 모든 것은 다른 폴더 구조를 사용하는 것처럼 보이는 버전 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
아무런 영향을 미치지 않습니다.
누구든지 버전 2.1에서 Topmenu 블록을 무시하고 다른 블록을 유추하기 위해해야 할 일을 정확하게 설명하는 데 도움이된다면 대단히 감사하겠습니다.
추가
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
에 "test"클래스를 추가 하여 Topmenu 클래스를 성공적으로 재정의했음을 확인하려고합니다.