V2.1 এ ব্লকগুলি কীভাবে ওভাররাইড করা যায়


14

আমি ম্যাজেন্টো ২.১ এ টপমেনু ব্লকটিকে ওভাররাইড করার চেষ্টা করছি তবে এটি করার জন্য কোনও গাইড খুঁজে পাচ্ছি না। আমি এখানে এবং অন্য কোথাও যা কিছু পেয়েছি তা কেবলমাত্র সংস্করণ ২.০ এ প্রয়োগ হয় যা ভিন্ন ফোল্ডার কাঠামো ব্যবহার করে বলে মনে হয় বা কেবলমাত্র আংশিক কোড উদাহরণ রয়েছে যা আমাকে ইতিমধ্যে তাদের যথাযথ প্রসঙ্গটি (যা আমি জানি না) জানতে পেরে প্রত্যাশা করে।

কাস্টম থিমের জন্য আমার বর্তমান ফোল্ডার কাঠামোটি 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, কিন্তু তন্ন তন্ন কোনো প্রভাব আছে।

টপমেনু ব্লকটি ওভাররাইড করার জন্য আমার ঠিক কী করা দরকার তা যদি কেউ ব্যাখ্যা করতে পারে তবে ভার্সন ২.১-এ আমি আরও প্রশংসা করব।

অভিযোজ্য বস্তু

আমি খোয়া ট্রুংডিনহ এর জবাব চেষ্টা করেছি কিন্তু এর কোনও প্রভাব পড়েনি । আমি নিম্নলিখিত ফাইলগুলি ব্যবহার করেছি:

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যাতে আমি টপমেনু ক্লাসকে সফলভাবে ওভাররাইড করে ফেলেছি তা নিশ্চিত করতে।
মাইকেলরশটন

আপনি কিভাবে এটি করতে পারেন? আমার গাইড আপনাকে সাহায্য করতে পারে?
খোয়া ট্রুংদিনহ

আমি আপনার নির্দেশাবলী যথাযথভাবে অনুসরণ করেছি আমি বুঝতে পেরেছি তবে এটি কার্যকর হয়নি। আমার কাস্টম টপমেনু মডিউল উপেক্ষা করা হবে এবং ডিফল্ট আচরণ ব্যবহার করা হচ্ছে।
মাইকেলরশটন

উইকএন্ডে, আমি আবার চেক করব এবং আমার সমাধান দেব।
খোোয়া ট্রুংদিনহ

উত্তর:


20

ওভাররাইড ব্লক:

app/codeফোল্ডারের অধীনে আপনার নিজস্ব মডিউল তৈরি করুন ।
আমরা preferenceম্যাজেন্টো 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>

এটি ম্যাজেন্টো বাগ হতে পারে: ব্লগটি পুনরায় লেখার সময় আমরা কি ম্যাজেন্টো 2- তে কোনও টেমপ্লেট পুনর্লিখন করতে বাধ্য হই?

[Edit]

1) আমরা টেমপ্লেট সেট করতে পারেন:

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / ব্লক / html / Topmenu.php

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

2) এক্সএমএলের মাধ্যমে টেমপ্লেট সেট করুন:

উদাহরণ স্বরূপ:

অ্যাপ্লিকেশন / কোড / বিক্রেতা / মডিউল / দৃশ্য / ফ্রন্টএন্ড / লেআউট / 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

আমরা নতুন মডিউলটি তৈরি করেছি কারণ আমরা ম্যাজেন্টোর ক্লাসটি ওভাররাইড করছি। আমরা যে কোনও ক্লাসকে ওভাররাইড করতে চাইলে আমাদের নতুন মডিউল তৈরি করতে হবে

এর অধীনে কাস্টম থিমটিতেapp/design/frontend রয়েছে:
--layout
--templates
--js
--html টেম্পলেট (নকআউট টেমপ্লেট)
--বিহীন, সিএসএস -
ইত্যাদি ...

এখানে এবং এখানে আরও পড়ুন ।

অটোলয়েডিং স্ট্যান্ডার্ড এবং নামকরণের সম্মেলন:

জন্য [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


ধন্যবাদ, তবে আমি এটি কাজে লাগাতে পারিনি। আমি আমার প্রশ্নটি আমার প্রশ্নের মধ্যে সম্পাদনা করেছি যাতে আপনি দেখতে পারেন যেখানে আমি অনিবার্যভাবে ভুল হয়ে গিয়েছিলাম।
মাইকেলরশটন

টেম্পলেট কি?
মাইকেলরশটন

আমি আমার উত্তর আপডেট। মনে হচ্ছে একটি ম্যাজেন্টো বাগ রয়েছে। আমাদের নতুন কাস্টম থিম তৈরি করতে হবে। এবং তারপরে আবার ক্লাস সেট করতে লেআউট তৈরি করুন।
খোয়া ট্রুংডিনহ

হ্যাঁ, এটি কাজ করেছিল। আপনাকে অনেক ধন্যবাদ. একদিন একটি বাগ নষ্ট ...
MichaelRushton

আমার কাস্টম থিমে থাকা কাস্টম_একউন্ট অ্যাকাউন্ট_ক্রিয়েট.এক্সএমএল ব্লক ফাইলটি আমি ওভাররাইড করতে হবে x এটা Magento 2.1.3 সরানো ভাল ??
বিজয় বি

3

ওভাররাইড ক্যাটালগ পণ্য তালিকার পণ্য ব্লক।

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) ফোল্ডারে listPr Prodct.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) ফোল্ডারে প্রোডাক্ট.এফপি মডেল ফাইল তৈরি করুন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();
    }
}

আপনি একই ব্লক ব্যবহার করে অন্য ব্লক, মডেল এবং নিয়ন্ত্রককে ওভাররাইড করতে পারেন।


দেখে মনে হচ্ছে শ্রেণি \ ম্যাজেন্টো \ ক্যাটালগ \ ব্লক \ পণ্য \ তালিকার উত্পাদক কাজ করে না (ম্যাজেন্টো ২.২ তে সম্ভবত?), লিঙ্কটি উল্লেখ করুন - গিথুব_মাইজেন্টো
অনিরুদ্ধ এ দেশপান্ডে

0

ক্লাসটি ওভাররাইড করতে আপনাকে একটি মডিউল তৈরি করতে হবে যেখানে আপনি ফাইল etc/di.xmlএবং Block/Html/Topmenu.phpফাইল যুক্ত করতে পারেন (উপরের কোডটি আপনার দ্বারা পোস্ট করা)

যেখানে নেমস্পেসটি আপনার বিক্রেতার নাম এবং মডিউল আপনার মডিউল নাম। যেমন: ম্যাজেন্টো হ'ল নেমস্পেস এবং থিম হ'ল মডিউল নাম।

কিভাবে একটি মডিউল তৈরি করার আরো তথ্যের জন্য, 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) অথবা আপনি যদি সত্যিই পছন্দসই পদ্ধতিতে করতে চান তবে আপনাকে অবশ্যই টেমপ্লেটটি মূল থেকে আপনার মডিউল / থিমটিতে অনুলিপি করতে হবে এবং এক্সএমএল দিয়ে আপডেট করতে হবে যাতে পরিবর্তে সেই টেমপ্লেটটি ব্যবহার করা হয়, তবে এটি যাদুতে কাজ শুরু করবে ..

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.