V2.1 में ब्लॉक को ओवरराइड कैसे करें


14

मैं 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>

आपने मल्टी सब कैटेगरी बनाने की कोशिश की?
खोआ TruongDinh

मुझे नहीं पता तुम्हारा क्या मतलब है। फिलहाल मैं सबमेनू में एक "परीक्षण" वर्ग जोड़ने की कोशिश कर रहा हूं ulताकि यह पुष्टि हो सके कि मैंने टॉपमेनू वर्ग को सफलतापूर्वक प्राप्त कर लिया है।
माइकल रटन

आप यह कैसे कर सकते हैं? मेरा मार्गदर्शक आपकी मदद कर सकता है?
बजे खोआ TruongDinh

मैंने आपके निर्देशों का सबसे अच्छा पालन किया जो मुझे समझ में आया लेकिन यह काम नहीं किया। मेरे कस्टम टॉपमेनू मॉड्यूल को नजरअंदाज कर दिया गया है और डिफ़ॉल्ट व्यवहार का उपयोग किया जा रहा है।
15:30 बजे माइकल रटन

सप्ताहांत में, मैं फिर से जांच करूंगा और आपको अपना समाधान दूंगा।
खोआ TruongDinh 15

जवाबों:


20

ओवरराइड ब्लॉक:

app/codeफ़ोल्डर के तहत अपना खुद का मॉड्यूल बनाएं ।
हम preferenceMagento 2 में कक्षा को ओवरराइड करने के लिए उपयोग कर सकते हैं ।

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / 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\Module\Block\Html\Topmenu" />
</config>

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / ब्लॉक / html / Topmenu.php

<?php

namespace Vendor\Module\Block\Html;

class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{

    protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
    {

    }

}

अस्थायी समाधान:
वर्तमान में, ऐसा लगता है कि उपरोक्त चरण ब्लॉक को पूरी तरह से ओवरराइड नहीं कर सकते। हमें नई कस्टम थीम बनाने की आवश्यकता है। और फिर, default.xmlफ़ाइल बनाएँ :

एप्लिकेशन / डिजाइन / दृश्यपटल / विक्रेता / विषय / Magento_Theme / लेआउट / default.xml

<?xml version="1.0"?>

<page layout="3columns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <update handle="default_head_blocks"/>
    <referenceBlock name="catalog.topnav" class="Vendor\Module\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>
</page>

यह एक Magento बग हो सकता है: क्या हम ब्लॉक को फिर से लिखते समय Magento2 में एक टेम्पलेट को फिर से लिखने के लिए मजबूर हैं?

[संपादित करें]

1) हम टेम्पलेट सेट कर सकते हैं:

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / ब्लॉक / html / Topmenu.php

public function setTemplate($template)
{
    return parent::setTemplate('Vendor_Module::custom-menu.phtml');
}

2) Xml के माध्यम से टेम्पलेट सेट करें:

उदाहरण के लिए:

एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / देखें / दृश्यपटल / लेआउट / checkout_cart_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="checkout.cart">
            <action method="setTemplate">
                <argument name="template" xsi:type="string">Magento_Checkout::cart.phtml</argument>
            </action>
        </referenceBlock>
    </body>
</page>

बनाने के लिए registration.phpऔर याद रखें module.xml

हम नए मॉड्यूल बनाते हैं क्योंकि हम Magento के वर्ग को ओवरराइड कर रहे हैं। जब हम किसी भी वर्ग को ओवरराइड करना चाहते हैं, तो हमें नया मॉड्यूल बनाना होगा

के अंतर्गत कस्टम विषय में app/design/frontendशामिल हैं:
--layout
--templates
--js
--html टेम्प्लेट (नॉकआउट टेम्प्लेट) -
रहित, css -
टेम्पलेट ...

यहाँ और यहाँ पढ़ें ।

ऑटोलोडिंग मानक और नामकरण सम्मेलन:

के लिए [Namespace]और [Module], हम और अधिक यहाँ पढ़ना चाहिए:

http://www.php-fig.org/psr/psr-0/
http://www.php-fig.org/psr/psr-4/
http://alanstorm.com/magento_2_autoloader_and_class_generation


धन्यवाद, लेकिन मैं यह काम करने में सक्षम नहीं था। मैंने अपने प्रयास को अपने प्रश्न में संपादित किया है ताकि आप देख सकें कि मैं अनिवार्य रूप से गलत कहाँ गया।
माइकलरटन

खाका क्या है?
माइकलरटन

मैंने अपना उत्तर अपडेट कर दिया। लगता है कि एक Magento बग है। हमें नई कस्टम थीम बनाने की आवश्यकता है। और फिर, कक्षा को फिर से सेट करने के लिए लेआउट बनाएं।
खोआ TruongDinh 3

हाँ, यह काम किया। आपका बहुत बहुत धन्यवाद। एक दिन एक बग पर बर्बाद हो गया ...
माइकलशर्टन

मुझे अपने कस्टम थीम में स्थित custom_account_create.xml में ब्लॉक फ़ाइल को ओवरराइड करना है। xml फ़ाइल Magento_Customer folder.which default.xml में है, मुझे magento_theme या magento_customer को बदलना है। मैं ब्लॉक को नष्ट करने में असमर्थ हूँ। मैं Magento2.1 का उपयोग कर रहा हूँ। Magento 2.1.3 को स्थानांतरित करना बेहतर है ??
vijay b

3

ओवरराइड कैटलॉग उत्पाद ListProduct ब्लॉक के लिए।

1) फ़ोल्डर में di.xml फ़ाइल बनाएँVendor/Module/etc

<?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\Catalog\Model\Product" type="Vendor\Module\Model\Rewrite\Catalog\Product" />
</config>

2) फ़ोल्डर में ListProduct.php ब्लॉक फ़ाइल बनाएँVendor/Module/Block/Rewrite/Product

<?php
namespace Vendor\Module\Block\Rewrite\Product;

class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
{
    public function _getProductCollection()
    {
        // Do your code here
    }
}

ओवरराइड कैटलॉग उत्पाद मॉडल के लिए।

1) इससे पहले 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\Catalog\Model\Product" type="Vendor\Module\Model\Rewrite\Catalog\Product" />
</config> 

2) फ़ोल्डर में Product.php मॉडल फ़ाइल बनाएँVendor/Module/Model/Rewrite/Catalog

<?php
namespace Vendor\Module\Model\Rewrite\Catalog;

class Product extends \Magento\Catalog\Model\Product
{
    public function isSalable()
    {
        // Do your code here

        return parent::isSalable();
    }

}

ओवरराइडिंग कंट्रोलर के लिए

1) di.xml में वरीयता जोड़ें

2) View.php नियंत्रक फ़ाइल बनाएँVendor/Module/Controller/Rewrite/Product

class View extends \Magento\Catalog\Controller\Product\View
{
    public function execute()
    {
        // Do your stuff here
        return parent::execute();
    }
}

आप इसी दृष्टिकोण का उपयोग करके अन्य ब्लॉक, मॉडल और नियंत्रकों को ओवरराइड कर सकते हैं।


ऐसा लगता है कि वर्ग \ Magento \ कैटलॉग \ ब्लॉक \ उत्पाद \ ListProduct के ओवरराइड काम नहीं करता है (Magento 2.2 में हो सकता है?), संदर्भ देखें - github.com/magento/magento2/issues/13152
अनिरुद्ध ए देशपांडे

0

वर्ग को ओवरराइड करने के लिए आपको एक मॉड्यूल बनाना होगा जहां आप etc/di.xmlऔर Block/Html/Topmenu.phpफ़ाइल (आपके द्वारा पोस्ट किए गए कोड से ऊपर) जोड़ सकते हैं

जहाँ Namespace आपके विक्रेता का नाम है और मॉड्यूल आपका मॉड्यूल नाम है। पूर्व के लिए: Magento नाम है और थीम मॉड्यूल नाम है।

मॉड्यूल बनाने के तरीके के बारे में अधिक जानकारी के लिए, http://devdocs.magento.com/guides/v2.1/extension-dev-guide/build/module-file-structure.html#module-file-structure


0

इस बग के कारण: https://github.com/magento/magento2/issues/3724 आप ब्लॉक कक्षाओं को वरीयता नहीं दे सकते।

1) (पसंदीदा) इसके बजाय क्या काम करता है कि उस वर्ग के लिए एक प्लगइन का उपयोग करें और आपको जो आवश्यक है उसे बदल दें। http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

2) या यदि आप वास्तव में वरीयता तरीका करना चाहते हैं तो आपको अपने मॉड्यूल / थीम से कोर को टेम्पलेट को कॉपी करने और xml के साथ अपडेट करने की भी आवश्यकता है ताकि इसके बजाय उस टेम्पलेट का उपयोग किया जाए, तो यह जादुई रूप से काम करना शुरू कर देगा ..

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.