Reading list Switch to dark mode

    How to change invoice template files in PrestaShop 1.7

    Updated 14 August 2023

    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:

    before_invoice

    Now we are going to remove product reference from the product table

    Searching for an experienced
    Prestashop Company ?
    Find out More

    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%">&nbsp;</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"> &nbsp;</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:

    after_invoice

    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].

    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    2 comments

  • Tautvydas
    • Gajendra Singh (Moderator)
  • Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home