magento2: Can not Overwrite Core Blocks In Custom Modules

Steps to reproduce

  1. Had to add extra table after sales order item for our Booking Module
  2. Tried to overwrite sales_order_item_renderers.xml from my module

Expected result

  1. After the block override, user should be able to view booking times with new participants details directly below the item purchased

Easy fix

  1. This issue is due to this line in sales_order_item_renderers.xml

    <referenceBlock name="sales.order.items.renderers">
        <block class="Magento\Sales\Block\Order\Item\Renderer\DefaultRenderer" as="default" template="order/items/renderer/default.phtml"/>
    </referenceBlock>
    

I can not override this if name is not present. If above code change to

    <referenceBlock name="sales.order.items.renderers">
        <block class="Magento\Sales\Block\Order\Item\Renderer\DefaultRenderer" name="sales.order.items.renderer.default" as="default" template="order/items/renderer/default.phtml"/>
    </referenceBlock>

So I can override it by our module

    <referenceBlock name="sales.order.items.renderers">
        <block class="Magento\Sales\Block\Order\Item\Renderer\DefaultRenderer" name="sales.order.items.renderer.default" as="default" template="Stepzerosolutions_Timeslotbooking::order/items/renderer/default.phtml"/>
    </referenceBlock>

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 26 (5 by maintainers)

Most upvoted comments

@nobuttsalex your method is working just their is small change is directory structure di.xml file should be in Vendor/Module/etc/di.xml instead of Vendor/Module/etc/frontend/di.xml

Here is the code that i use for override default renderer of email template.

Vendor/Module/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
	<preference for="Magento\Sales\Block\Order\Email\Items\Order\DefaultOrder" type="Vendor\Module\Block\Order\Email\Items\Order\DefaultOrder" />
</config>

Vendor/Module/Block/Order/Email/Items/Order/DefaultOrder.php

class DefaultOrder extends \Magento\Sales\Block\Order\Email\Items\Order\DefaultOrder
{
    public function setTemplate($template) {
        return parent::setTemplate('Vendor_Module::email/items/order/default.phtml');
    }
}

For override default.phtml file copy from magento\module-sales\view\frontend\templates\email\items\order\default.phtml to your module Vendor/Module/view/frontend/templates/email/items/order/default.phtml

Having the same issue while overriding default email order template in file app/code/Vendor/Module/view/frontend/layout/sales_email_order_renderers.xml `<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" label="Email Creditmemo Items List" design_abstraction="custom">

<body>

    <referenceBlock name="sales.email.order.renderers">

    	<block class="Magento\Sales\Block\Order\Email\Items\Order\DefaultOrder" as="default" template="Vendor_Module::email/items/order/default.phtml"/>

    </referenceBlock>

</body>

</page>`

Giving exception: main.CRITICAL: Magento\Framework\Exception\LocalizedException: The element ‘sales.email.order.renderers’ already has a child with alias ‘default’ in /var/www/vhosts/shop/vendor/magento/framework/Data/Structure.php:611

and if we remove the alias “as = default” from xml file… <block class="Magento\Sales\Block\Order\Email\Items\Order\DefaultOrder" name="sales.email.order.renderers.default" template="Vendor_Module::email/items/order/default.phtml"/>

file doesn’t get override. Any way to override default template?

Not ideal but can be done using a preference and overriding setTemplate.

etc/fontend/di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Sales\Block\Order\Item\Renderer\DefaultRenderer" type="My\Module\Block\Order\Item\Renderer\DefaultRenderer" />
</config>

Block/Order/Item/Renderer/DefaultRenderer.php

<?php
namespace My\Module\Block\Order\Item\Renderer;

class DefaultRenderer extends \Magento\Sales\Block\Order\Item\Renderer\DefaultRenderer
{
    public function setTemplate($template) {
        return parent::setTemplate('My_Module::order/items/renderer/default.phtml');
    }
}

@forgeonline ok, i will try to find this.

above code worked for me.Thanks.

Another option you have is to set your template to the overriden_templates argument of <block class="Magento\Sales\Block\Order\Items" name="order_items" template="order/items.phtml">