Ini adalah cara melakukannya dengan benar, dan tanpa peretasan.
Saya tidak mencari use case OP, tetapi saya harus dapat memodifikasi renderers di dalam troli. Masalahnya adalah, seperti dalam kasus OP, theMagento_Checkout
modul tidak memberikan nama kepada penyaji, yang berarti mereka tidak dapat direferensikan dan template mereka diubah menggunakan metode tradisional atau terdokumentasi. Namun, setelah melakukan sleuthing, saya menemukan cara melakukannya menggunakan alat yang disediakan Magento2 secara langsung dalam tata letak XML.
Perhatikan bahwa ada tempat lain di mana pendekatan yang sama ini bekerja, seperti di Magento\Sales\Block\Items\AbstractItems
blok. The Magento_Checkout
dan Magento_Sales
modul adalah dua yang membuat sebagian besar menggunakan penyaji item, sehingga mencakup ini banyak pertanyaan yang akan mengakibatkan seseorang untuk mengubah template blok tanpa nama. Alasan ini diposkan adalah karena tidak terhindarkannya orang lain yang mencari cara memodifikasi templat renderer di checkout atau modul penjualan.
Saya akan memberikan solusinya terlebih dahulu, dan kemudian menjelaskannya secara terperinci bagi siapa saja yang ingin tahu mengapa itu bekerja.
Larutan
Tambahkan berikut ini ke checkout_cart_index.xml
file tata letak:
<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>
Perhatikan bahwa nama modul dan jalur perlu dimodifikasi untuk mencerminkan basis kode Anda.
Penjelasan
Ini berfungsi dengan memanfaatkan overridden_templates
data blok, yang tidak didefinisikan secara default.
Di Magento_Checkout
, checkout_cart_index.xml
file layout mendefinisikan blok berikut:
<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>
Itu kemudian mendefinisikan beberapa renderers dalam checkout_cart_item_renderers.xml
file tata letak:
<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>
Sayangnya, mereka tidak dapat dirujuk oleh alias mereka, default
dan simple
, masing-masing.
Namun, melihat ke dalam Magento\Checkout\Block\Cart\Grid
Blok, yang dinamai checkout.cart.form
, dan merupakan induk dari penyaji, dapat dicatat bahwa ada panggilan ke getItemHtml
metode dalam templat terkait cart/form.phtml
,. Metode itu kemudian memanggil getItemRenderer
. Kedua metode ini didefinisikan dalam Grid
kelas induk AbstractBlock
,. Di sinilah overridden_templates
data digunakan:
/**
* 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);
}
Dengan pengetahuan ini, mengisi blok dengan data dari tata letak XML secara langsung menggunakan arguments
sintaks Magento2 .