मैं 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 संस्करण में टोपमेनू ब्लॉक (और किसी अन्य ब्लॉक को रोककर) को ओवरराइड करने के लिए क्या करना चाहिए, तो मुझे बहुत सराहना मिलेगी।
परिशिष्ट
मैंने खोआ 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
, और Magento कैश प्लावित। सबमेनू का इरादा "परीक्षण" वर्ग नहीं है:
<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
ताकि यह पुष्टि हो सके कि मैंने टॉपमेनू वर्ग को सफलतापूर्वक प्राप्त कर लिया है।