ম্যাজেন্টো 2: "নাম" ছাড়াই কীভাবে একটি ব্লকের টেমপ্লেট পরিবর্তন করবেন


10

আমি আমার কাস্টম টেমপ্লেট সহ একটি ব্লকের টেম্পলেটকে ওভাররাইড করতে পরিবর্তন করতে চাই। তবে এটির একটি "নাম" নেই, এটির কেবল "as" রয়েছে। আমি যেটি ওভাররাইড করতে চাই তা হ'ল:

<block class="Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer"
       as="default"
       template="order/view/items/renderer/default.phtml"/>

উত্তর:


8

ALIAS লেআউট থাকা কোনও টেম্পলেট কীভাবে ওভাররাইড করা যায়।

এই উত্তরটি একটি সম্ভাব্য উদাহরণ, আপনি ALIAS টেম্পলেটটিকে ওভাররাইড করতে এটি অনুসরণ করতে পারেন।

আমি দুটি উদাহরণ মডিউল তৈরি করেছি, Vendor_Moduleওরফে টেমপ্লেট সহ লেআউট আছে, আমরা Vendortwo_Moduletwoমডিউল দ্বারা এই উরফটিকে ওভাররাইড করছি ।

ধরুন আপনি মডিউল তৈরির পদক্ষেপগুলি জানেন তবে আমি সম্পূর্ণ মডিউল তৈরির পোস্ট দিচ্ছি না।

মডিউল 1

\ অ্যাপ্লিকেশন \ কোড \ বিক্রেতার \ মডিউল \ ইত্যাদি \ ফ্রন্টএন্ড \ routes.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="standard">
        <route id="module" frontName="module">
            <module name="Vendor_Module" />
        </route>
    </router>
</config>

\ অ্যাপ্লিকেশন \ কোড \ বিক্রেতার \ মডিউল \ দৃশ্য \ ফ্রন্টএন্ড \ বিন্যাস \ module_test_test.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
     <body>     
        <referenceContainer name="content">         
            <block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
                <block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
            </block>
        </referenceContainer>      
    </body>
</page>

মডিউল 2

\ অ্যাপ্লিকেশন \ কোড \ Vendortwo \ Moduletwo \ ইত্যাদি \ ফ্রন্টএন্ড \ routes.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="standard">
        <route id="moduletwo" frontName="moduletwo">
            <module name="Vendortwo_Moduletwo" />
        </route>
    </router>
</config>

\ অ্যাপ্লিকেশন \ কোড \ Vendortwo \ Moduletwo \ দৃশ্য \ ফ্রন্টএন্ড \ বিন্যাস \ default.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <referenceBlock name="test_test">
            <block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
        </referenceBlock>
</page>

ক্যাশে সরানোর পরে, আমি http: // লোকালহস্ট / ম্যাজেন্টো 210 / মডিউল / পরীক্ষা / পরীক্ষা চালাই

ওরফে টেমপ্লেটটি ওভাররাইড করে Vendortwo_Moduletwo two/twoalias.phtml

এখানে চিত্র বর্ণনা লিখুন


সুতরাং, এটির কোনও একটি ব্লককে তার উপনাম দ্বারা ওভাররাইড করা হচ্ছে? আমি যদি ওভাররাইড না করে তার পরে অন্য একটি ব্লক যুক্ত করতে চাই তবে কী হবে?
জোনিস এলমারিস

3

এটি সঠিকভাবে এবং হ্যাক ছাড়াই কীভাবে করা যায়।

আমি ওপি-র ব্যবহারের ক্ষেত্রে সন্ধান করিনি, তবে কার্টের মধ্যে রেন্ডারগুলিকে সংশোধন করতে আমার সক্ষম হওয়া দরকার। সমস্যাটি হ'ল, ওপি-র ক্ষেত্রে, Magento_Checkoutমডিউলটি রেন্ডারদের নাম সরবরাহ করে না, যার অর্থ তাদের রেফারেন্স করা যায় না এবং traditionalতিহ্যবাহী বা নথিভুক্ত পদ্ধতি ব্যবহার করে তাদের টেমপ্লেটগুলি পরিবর্তন করা যায়। যাইহোক, কিছু জঘন্যতার পরে, আমি আবিষ্কার করেছিলাম কীভাবে সরঞ্জামগুলি ব্যবহার করতে হয় তা Magento2 আমাদের সরাসরি XML বিন্যাসে সরবরাহ করে।

মনে রাখবেন যে অন্যান্য জায়গাগুলি যেখানে একই দৃষ্টিভঙ্গি কাজ করে যেমন Magento\Sales\Block\Items\AbstractItemsব্লক। Magento_Checkoutএবং Magento_Salesমডিউল, দুটি ঐ আইটেমটির রেন্ডারারগুলির অধিকাংশ ব্যবহার করতে, তাই প্রশ্নের একটি নাম ছাড়া একটি ব্লক টেম্পলেট পরিবর্তন কাউকে নেতৃত্ব অনেক এই কভার। এটি পোস্ট করার কারণ হ'ল চেকআউট বা বিক্রয় মডিউলগুলিতে কীভাবে রেন্ডারার টেম্পলেটগুলি সংশোধন করা যায় তা অন্যের অনিবার্যতার কারণে।

আমি প্রথমে সমাধানটি সরবরাহ করতে যাচ্ছি, এবং তারপরে যে কেউ এটি কেন কাজ করে তা জানতে চায় এমন ব্যক্তির জন্য এটি বিশদভাবে ব্যাখ্যা করব।

সমাধান

checkout_cart_index.xmlলেআউট ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন:

<referenceBlock name="checkout.cart.form">
    <arguments>
        <argument name="overridden_templates" xsi:type="array">
            <item name="default" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/default.phtml</item>
            <item name="simple" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/simple.phtml</item>
            <item name="configurable" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/configurable.phtml</item>
        </argument>
    </arguments>
</referenceBlock>

নোট করুন যে আপনার কোডবেসটি প্রতিবিম্বিত করতে মডিউলটির নাম এবং পথটি সংশোধন করা দরকার।

ব্যাখ্যা

এটি overridden_templatesব্লক ডেটা লাভারেজ করে কাজ করে যা ডিফল্টরূপে সংজ্ঞায়িত হয় না।

ইন Magento_Checkout, checkout_cart_index.xmlবিন্যাস ফাইলটি নিম্নলিখিত ব্লকটি সংজ্ঞায়িত করে:

<block class="Magento\Checkout\Block\Cart\Grid" name="checkout.cart.form" as="cart-items" template="cart/form.phtml" after="cart.summary">
    <block class="Magento\Framework\View\Element\RendererList" name="checkout.cart.item.renderers" as="renderer.list"/>
    <block class="Magento\Framework\View\Element\Text\ListText" name="checkout.cart.order.actions"/>
</block>

এরপরে এটি checkout_cart_item_renderers.xmlলেআউট ফাইলে সেই দু'জন রেন্ডারারের সংজ্ঞা দেয় :

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <update handle="checkout_item_price_renderers"/>
    <body>
        <referenceBlock name="checkout.cart.item.renderers">
            <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml">
                <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.default.actions" as="actions">
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.default.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/>
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.default.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/>
                </block>
            </block>
            <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml">
                <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.simple.actions" as="actions">
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.simple.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/>
                    <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.simple.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/>
                </block>
            </block>
        </referenceBlock>
    </body>
</page>

দুর্ভাগ্যক্রমে, তাদের যথাক্রমে তাদের উপস্বত্ত্বগুলি defaultএবং উল্লেখ করা simpleযায় না।

যাইহোক, Magento\Checkout\Block\Cart\Gridনাম দেওয়া হয়েছে checkout.cart.formএবং এটি রেন্ডারদের পিতামাতা, সেই ব্লকটি অনুসন্ধান করে এটি লক্ষ করা যেতে পারে যে getItemHtmlসম্পর্কিত টেম্পলেটে পদ্ধতিতে একটি কল আছে cart/form.phtml,। সেই পদ্ধতিটি তখন কল করে getItemRenderer। এই দুটি পদ্ধতিই Gridএর পিতামাতার ক্লাসে সংজ্ঞায়িত করা হয় AbstractBlock,। এখানেই overridden_templatesডেটা ব্যবহৃত হয়:

/**
 * Retrieve item renderer block
 *
 * @param string|null $type
 * @return \Magento\Framework\View\Element\Template
 * @throws \RuntimeException
 */
public function getItemRenderer($type = null)
{
    if ($type === null) {
        $type = self::DEFAULT_TYPE;
    }
    $rendererList = $this->_getRendererList();
    if (!$rendererList) {
        throw new \RuntimeException('Renderer list for block "' . $this->getNameInLayout() . '" is not defined');
    }
    $overriddenTemplates = $this->getOverriddenTemplates() ?: [];
    $template = isset($overriddenTemplates[$type]) ? $overriddenTemplates[$type] : $this->getRendererTemplate();
    return $rendererList->getRenderer($type, self::DEFAULT_TYPE, $template);
}

এই জ্ঞানের সাথে, লেআউট এক্সএমএল থেকে ডেটা সহ ব্লকটি পপুলেট করা ম্যাজেন্টো 2 এর argumentsসিনট্যাক্স ব্যবহার করে সোজা is


1
এটিকে আসল সমাধান হিসাবে গ্রহণ করা উচিত। সহজ এবং কার্যকর। যথাযথ Magento2 উপায়। দুর্দান্ত ব্যাখ্যা। ধন্যবাদ!
আইভা

2

আমার সমাধান সর্বজনীন নয়, এটি একটি "নোংরা হ্যাক" তবে এটি নির্দিষ্ট ক্ষেত্রে কার্যকর হতে পারে। আমার নমুনাটি অগ্রণী রেন্ডারারের জন্য, অ্যাডমিনটিচটিএমএলের জন্য নয় (আমি মনে করি এটি একই হওয়া উচিত)।

\Magento\Framework\Data\Structure::getChildId" $ প্যারেন্টআইডি == 'চেকআউট.কার্ট.াইটেম.রেেন্ডারস' " শর্ত সহ ব্রেকআপ পয়েন্ট সেটআপ করুন (এটি আপনি checkout_cart_item_renderers.xmlলেআউটে দেখতে পাওয়ায় প্যারেন্ট ব্লকের একটি নাম )। সমস্ত শিশু ব্লকের নিজস্ব (গণিত) নাম রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

আপনার মডিউলের লেআউট আপডেটে এই নামগুলি ব্যবহার করুন:

    <referenceBlock name="checkout.cart.item.renderers_schedule_block4">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">Vendor_Module::cart/item/default.phtml</argument>
        </action>
    </referenceBlock>

2
এটি দেখার জন্য যে কারও কাছেও সচেতন থাকুন যে আপনি যদি একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একবারের সাথে "একসাথে" দেখতে নাও করতে পারেন তবে তা জেনে রাখুন। কার্ড দিয়ে আপনার ঘর তৈরি করবেন না। এই সংখ্যাগুলি গ্যারান্টিযুক্ত নয়।
danemacmillan

0

দয়া করে আমার উত্তরটি এখানে দেখুন: https://magento.stackexchange.com/a/239387/14403

আমি বিশ্বাস করি এটিই সেই সমাধান যা আপনার পক্ষে সবচেয়ে ভাল কাজ করবে। সমাধানটির মধ্যে এমন কোনও ব্লক / টেমপ্লেটকে ওভাররাইড করা অন্তর্ভুক্ত রয়েছে যার নাম নেই কেবল উপনাম।

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