Это как сделать это правильно и без взломов.
Я не искал сценарий использования OP, но мне нужно было иметь возможность изменять средства визуализации в корзине. Проблема заключается в том, что, как и в случае с OP, Magento_Checkout
модуль не предоставляет имена для средств визуализации, что означает, что на них нельзя ссылаться и их шаблоны изменяются с использованием традиционных или документированных методов. Тем не менее, после некоторой проверки я обнаружил, как это сделать, используя инструменты, которые 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);
}
Обладая этими знаниями, заполнение блока данными из макета XML является простым, используя arguments
синтаксис Magento2 .