นี่คือวิธีการทำอย่างถูกต้องและไม่มีแฮ็ค
ฉันไม่ได้ค้นหากรณีการใช้ของ 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