Magento 2: วิธีการเปลี่ยนเทมเพลตของบล็อกโดยไม่มี“ ชื่อ”


10

ฉันต้องการเปลี่ยนเพื่อแทนที่เทมเพลตของบล็อกด้วยเทมเพลตที่กำหนดเองของฉัน แต่มันไม่มี "ชื่อ" แต่จะมี "เป็น" เท่านั้น สิ่งที่ฉันต้องการแทนที่คือ:

<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

\ แอป \ รหัส \ ผู้ขาย \ โมดูล \ etc \ ส่วนหน้า \ 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 \ etc \ ส่วนหน้า \ 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: // localhost / magento210 / module / test / test

แม่แบบนามแฝงถูกแทนที่โดย Vendortwo_Moduletwo two/twoalias.phtml

ป้อนคำอธิบายรูปภาพที่นี่


ดังนั้นนี่คือการแทนที่บล็อกโดยนามแฝงหรือไม่? ถ้าฉันไม่ต้องการแทนที่มัน แต่เพิ่ม block อื่นหลังจากมัน
Jānis Elmeris

3

นี่คือวิธีการทำอย่างถูกต้องและไม่มีแฮ็ค

ฉันไม่ได้ค้นหากรณีการใช้ของ OP แต่ฉันต้องสามารถปรับเปลี่ยน renderers ภายในรถเข็นได้ ปัญหาคือว่าในกรณีของ OP Magento_Checkoutโมดูลไม่ได้ให้ชื่อกับ renderers ซึ่งหมายความว่าพวกเขาไม่สามารถอ้างอิงและแม่แบบของพวกเขาเปลี่ยนไปโดยใช้วิธีดั้งเดิมหรือเอกสาร อย่างไรก็ตามหลังจากทำการค้นคว้าบางอย่างฉันค้นพบวิธีการใช้เครื่องมือที่วีโอไอพี 2 มอบให้เราโดยตรงในโครงร่าง XML

โปรดทราบว่ามีสถานที่อื่น ๆ ที่ใช้วิธีการเดียวกันนี้ได้เช่นในMagento\Sales\Block\Items\AbstractItemsบล็อก Magento_CheckoutและMagento_Salesโมดูลที่สองที่ทำให้การใช้มากที่สุดของโหมดแสดงรายการเพื่อให้ครอบคลุมนี้หลายคำสั่งที่จะนำไปสู่คนที่จะเปลี่ยนแม่แบบบล็อกที่ไม่มีชื่อ เหตุผลที่โพสต์นี้เป็นเพราะความไม่สามารถหลีกเลี่ยงได้ของผู้อื่นที่กำลังมองหาวิธีแก้ไขเทมเพลตของ renderer ในโมดูลการชำระเงินหรือการขาย

ฉันจะให้วิธีแก้ปัญหาก่อนจากนั้นอธิบายรายละเอียดให้กับทุกคนที่อยากรู้ว่าทำไมมันถึงได้ผล

สารละลาย

เพิ่มสิ่งต่อไปนี้ใน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>

โปรดทราบว่าชื่อโมดูลและเส้นทางจะต้องได้รับการแก้ไขเพื่อให้สะท้อนถึง codebase ของคุณ

คำอธิบาย

สิ่งนี้ทำงานโดยใช้ประโยชน์จาก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);
}

ด้วยความรู้นี้การสร้างบล็อกด้วยข้อมูลจากโครงร่าง XML จึงเป็นเรื่องง่ายโดยใช้argumentsไวยากรณ์ของ Magento2


1
สิ่งนี้ควรได้รับการยอมรับว่าเป็นทางออกที่แท้จริง ง่ายและมีประสิทธิภาพ วิธี Magento2 ที่เหมาะสม คำอธิบายที่ดี ขอบคุณ!
iva

2

โซลูชันของฉันไม่เป็นสากลมันเป็น "แฮ็คสกปรก" แต่อาจมีประโยชน์ในบางกรณี ตัวอย่างของฉันใช้สำหรับตัวแสดงส่วนหน้าไม่ใช่สำหรับ adminhtml (ฉันคิดว่ามันควรจะเหมือนกัน)

จุดพักการตั้งค่า\Magento\Framework\Data\Structure::getChildIdด้วยเงื่อนไข " $ parentId == 'checkout.cart.item.renderers' " (นี่คือชื่อสำหรับบล็อกหลักที่คุณสามารถเห็นใน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.