Đây là cách để làm điều đó đúng, và không có hack.
Tôi đã không tra cứu trường hợp sử dụng của OP, nhưng tôi cần có thể sửa đổi các trình kết xuất trong giỏ hàng. Vấn đề là, giống như trong trường hợp của OP, Magento_Checkout
mô-đun không cung cấp tên cho trình kết xuất, điều đó có nghĩa là chúng không thể được tham chiếu và các mẫu của chúng thay đổi bằng phương pháp truyền thống hoặc tài liệu. Tuy nhiên, sau một số điều tra, tôi đã khám phá ra cách thực hiện bằng cách sử dụng các công cụ Magento2 cung cấp cho chúng tôi trực tiếp trong bố cục XML.
Lưu ý rằng có những nơi khác mà cách tiếp cận tương tự này hoạt động, chẳng hạn như trong Magento\Sales\Block\Items\AbstractItems
khối. Các mô-đun Magento_Checkout
và Magento_Sales
hai mô-đun là hai sử dụng hầu hết các trình kết xuất vật phẩm, vì vậy điều này bao gồm nhiều truy vấn sẽ dẫn đến việc ai đó thay đổi mẫu của một khối mà không có tên. Lý do điều này được đăng là vì không thể tránh khỏi những người khác đang tìm cách sửa đổi các mẫu trình kết xuất trong thanh toán hoặc mô-đun bán hàng.
Tôi sẽ cung cấp giải pháp trước, và sau đó giải thích chi tiết cho bất kỳ ai muốn biết lý do tại sao nó hoạt động.
Giải pháp
Thêm phần sau vào checkout_cart_index.xml
tệp bố cục:
<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>
Lưu ý rằng tên mô-đun và đường dẫn cần được sửa đổi để phản ánh cơ sở mã của bạn.
Giải trình
Điều này hoạt động bằng cách tận dụng overridden_templates
dữ liệu khối, không được xác định theo mặc định.
Trong Magento_Checkout
, checkout_cart_index.xml
tệp bố trí xác định khối sau:
<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>
Sau đó, nó định nghĩa một vài trình kết xuất trong checkout_cart_item_renderers.xml
tệp bố cục:
<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>
Thật không may, chúng không thể được tham chiếu bởi các bí danh của chúng, default
và simple
, tương ứng.
Tuy nhiên, nhìn vào Magento\Checkout\Block\Cart\Grid
Block, được đặt tên checkout.cart.form
và là cha mẹ của các trình kết xuất, có thể lưu ý rằng có một lệnh gọi getItemHtml
phương thức trong mẫu liên quan , cart/form.phtml
. Phương pháp đó sau đó gọi getItemRenderer
. Cả hai phương thức này đều được định nghĩa trong Grid
lớp cha của , AbstractBlock
. Đây là nơi overridden_templates
dữ liệu được sử dụng:
/**
* 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);
}
Với kiến thức này, việc điền vào khối dữ liệu từ bố cục XML rất đơn giản bằng arguments
cú pháp của Magento2 .