In this blog, we are going to learn how to change invoice template files in PrestaShop.
So let’s understand how to achieve it:
Sometimes, we need to modify invoices. we can do it using two ways one is directly modifying core invoice template files which is not a good way because it could be overridden after upgrading PrestaShop and another one is described in this blog.
The below invoice is a default PrestaShop Invoice:
Now we are going to remove product reference from the product table
To achieve this we need to do changes in the core HTMLTemplate class and thanks to PrestaShop for giving us the great feature of overriding classes using modules.
So we will override the class in our module.
Create a new file at path {your-module/override/classes/pdf/HTMLTemplate.php}
Now add the below code in this file:
class HTMLTemplate extends HTMLTemplateCore { protected function getTemplate($template_name) { if (Module::isEnabled('your-module')) { $overriddenTemplate = _PS_MODULE_DIR_ . 'your-module/views/templates/hook/' . $template_name . '.tpl'; if (file_exists($overriddenTemplate)) { return $overriddenTemplate; } } return parent::getTemplate($template_name); } public function getContent() { } public function getFilename() { } public function getBulkFilename() { } }
In the above code, simply we have checked our module-enabled condition and returned the template file if exists in our module.
We are removing product reference so we have to do changes in the invoice.product-tab.tpl file.
Now we will create a new invoice.product-tab.tpl file at path {your-module/views/templates/hook/invoice.product-tab.tpl}
We will copy and paste all codes of the default PrestaShop file invoice.product-tab.tpl and modify it according to the need.
{** * Copyright since 2007 PrestaShop SA and Contributors * PrestaShop is an International Registered Trademark & Property of PrestaShop SA * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.md. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to https://devdocs.prestashop.com/ for more information. * * @author PrestaShop SA and Contributors <[email protected]> * @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) *} <table class="product" width="100%" cellpadding="4" cellspacing="0"> {assign var='widthColProduct' value=$layout.product.width} {if !$isTaxEnabled} {assign var='widthColProduct' value=$widthColProduct+$layout.tax_code.width} {/if} <thead> <tr> {* <th class="product header small" width="{$layout.reference.width}%">{l s='Reference' d='Shop.Pdf' pdf='true'}</th> *} <th class="product header small" width="{$widthColProduct+$layout.reference.width}%">{l s='Product' d='Shop.Pdf' pdf='true'}</th> {if $isTaxEnabled} <th class="product header small" width="{$layout.tax_code.width}%">{l s='Tax Rate' d='Shop.Pdf' pdf='true'}</th> {/if} {if isset($layout.before_discount)} <th class="product header small" width="{$layout.unit_price_tax_excl.width}%"> {l s='Base price' d='Shop.Pdf' pdf='true'}{if $isTaxEnabled}<br /> {l s='(Tax excl.)' d='Shop.Pdf' pdf='true'}{/if} </th> {/if} <th class="product header-right small" width="{$layout.unit_price_tax_excl.width}%"> {l s='Unit Price' d='Shop.Pdf' pdf='true'}{if $isTaxEnabled}<br /> {l s='(Tax excl.)' d='Shop.Pdf' pdf='true'}{/if} </th> <th class="product header small" width="{$layout.quantity.width}%">{l s='Qty' d='Shop.Pdf' pdf='true'}</th> <th class="product header-right small" width="{$layout.total_tax_excl.width}%"> {l s='Total' d='Shop.Pdf' pdf='true'}{if $isTaxEnabled}<br /> {l s='(Tax excl.)' d='Shop.Pdf' pdf='true'}{/if} </th> </tr> </thead> <tbody> <!-- PRODUCTS --> {foreach $order_details as $order_detail} {cycle values=["color_line_even", "color_line_odd"] assign=bgcolor_class} <tr class="product {$bgcolor_class}"> <td class="product left"> {if $display_product_images} <table width="100%"> <tr> <td width="15%"> {if isset($order_detail.image) && $order_detail.image->id} {$order_detail.image_tag} {/if} </td> <td width="5%"> </td> <td width="80%"> {$order_detail.product_name} </td> </tr> </table> {else} {$order_detail.product_name} {/if} </td> {if $isTaxEnabled} <td class="product center"> {$order_detail.order_detail_tax_label} </td> {/if} {if isset($layout.before_discount)} <td class="product center"> {if isset($order_detail.unit_price_tax_excl_before_specific_price)} {displayPrice currency=$order->id_currency price=$order_detail.unit_price_tax_excl_before_specific_price} {else} -- {/if} </td> {/if} <td class="product right"> {displayPrice currency=$order->id_currency price=$order_detail.unit_price_tax_excl_including_ecotax} {if $order_detail.ecotax_tax_excl > 0} <br> <small>{{displayPrice currency=$order->id_currency price=$order_detail.ecotax_tax_excl}|string_format:{l s='ecotax: %s' d='Shop.Pdf' pdf='true'}}</small> {/if} </td> <td class="product center"> {$order_detail.product_quantity} </td> <td class="product right"> {displayPrice currency=$order->id_currency price=$order_detail.total_price_tax_excl_including_ecotax} </td> </tr> {foreach $order_detail.customizedDatas as $customizationPerAddress} {foreach $customizationPerAddress as $customizationId => $customization} <tr class="customization_data {$bgcolor_class}"> <td class="center"> </td> <td> {if isset($customization.datas[Product::CUSTOMIZE_TEXTFIELD]) && count($customization.datas[Product::CUSTOMIZE_TEXTFIELD]) > 0} <table style="width: 100%;"> {foreach $customization.datas[Product::CUSTOMIZE_TEXTFIELD] as $customization_infos} <tr> <td>{$customization_infos.name|escape:'html':'UTF-8'|string_format:{l s='%s:' d='Shop.Pdf' pdf='true'}} {if (int)$customization_infos.id_module}{$customization_infos.value nofilter}{else}{$customization_infos.value}{/if}</td> </tr> {/foreach} </table> {/if} {if isset($customization.datas[Product::CUSTOMIZE_FILE]) && count($customization.datas[Product::CUSTOMIZE_FILE]) > 0} <table style="width: 100%;"> <tr> <td style="width: 70%;">{l s='image(s):' d='Shop.Pdf' pdf='true'}</td> <td>{count($customization.datas[Product::CUSTOMIZE_FILE])}</td> </tr> </table> {/if} </td> <td class="center"> ({if $customization.quantity == 0}1{else}{$customization.quantity}{/if}) </td> {assign var=end value=($layout._colCount-3)} {for $var=0 to $end} <td class="center"> -- </td> {/for} </tr> {/foreach} {/foreach} {/foreach} <!-- END PRODUCTS --> <!-- CART RULES --> {assign var="shipping_discount_tax_incl" value="0"} {foreach from=$cart_rules item=cart_rule name="cart_rules_loop"} {if $smarty.foreach.cart_rules_loop.first} <tr class="discount"> <th class="header" colspan="{$layout._colCount}"> {l s='Discounts' d='Shop.Pdf' pdf='true'} </th> </tr> {/if} <tr class="discount"> <td class="white right" colspan="{$layout._colCount - 1}"> {$cart_rule.name} </td> <td class="right white"> - {displayPrice currency=$order->id_currency price=$cart_rule.value_tax_excl} </td> </tr> {/foreach} </tbody> </table>
In the above code, we have removed only product reference-related codes.
After removing the product reference invoice look like this:
You can modify other invoices (invoice.addresses-tab.tpl, invoice.shipping-tab.tpl, and invoice.payment-tab.tpl, etc…) files like this.
That’s all about this blog. Hope it will help you.
If you are facing any issues or doubts in the above process, please feel free to contact us through the comment section.
We would be happy to help.
Also, you can explore our PrestaShop Development Services & a large range of quality PrestaShop Modules.
For any doubt contact us at [email protected].
2 comments
We have described with example of product listing with invoice.product-tab tpl, but if you want to add new data like store details, you need to override other tpls as per your place to add.
You can see all templates here:
https://github.com/PrestaShop/PrestaShop/tree/8.1.5/pdf
Thanks,