cikcak Posted November 19, 2014 Share Posted November 19, 2014 Hello, I have a large invoices in 2 pages and I really need to do this; Header show only in first page and footer show only in last page. Now In every page I have header and footer. Link to comment Share on other sites More sharing options...
patrikar Posted November 19, 2014 Share Posted November 19, 2014 Hello, I have a large invoices in 2 pages and I really need to do this; Header show only in first page and footer show only in last page. Now In every page I have header and footer. Hi cikcak, Remove the content from pdf/header.tpl and pdf/footer.tpl and place it at the top and at the bottom of invoice.tpl (and other pdf templates you use). Some variables used in header or footer might not be available for use in invoice.tpl, if this is the case, perhaps you could simply write the values directly in the code instead (if that is an option for your project). header.tpl and footer.tpl is included at the top/bottom of every page. So the only way to change it is to not use those files. Good luck Link to comment Share on other sites More sharing options...
cikcak Posted November 19, 2014 Share Posted November 19, 2014 Hi cikcak, Remove the content from pdf/header.tpl and pdf/footer.tpl and place it at the top and at the bottom of invoice.tpl (and other pdf templates you use). Some variables used in header or footer might not be available for use in invoice.tpl, if this is the case, perhaps you could simply write the values directly in the code instead (if that is an option for your project). header.tpl and footer.tpl is included at the top/bottom of every page. So the only way to change it is to not use those files. Good luck But how to do that footer would be at the bottom of page? Now its after all content and I see it in middle of page. Link to comment Share on other sites More sharing options...
patrikar Posted November 19, 2014 Share Posted November 19, 2014 (edited) But how to do that footer would be at the bottom of page? Now its after all content and I see it in middle of page. I don't think there is a simple solution to that problem. I believe that you will have to hack it yourself or hire someone to do it. Edited November 19, 2014 by patrikar (see edit history) Link to comment Share on other sites More sharing options...
eleazar Posted November 20, 2014 Share Posted November 20, 2014 I don't think there is a simple solution to that problem. I believe that you will have to hack it yourself or hire someone to do it. Exactly! However, you've been on the right track. The best way is to study this whole topic carefully, in this special case my post here from May 2013. You got to modify the assemby of the pdf invoice in /classes/pdf/pdf.php by disabling the rendering of the header and the footer, which btw for the header is a bit tricky, for you need to do some changes in /classes/pdf/PDFgenerator.php too (so you guys better read my post). Link to comment Share on other sites More sharing options...
toncika Posted November 22, 2014 Share Posted November 22, 2014 (edited) Hi to everyone, I'm using PS 1.6.0.9, default bootsrap template and I'm trying to customize the invoice in order to get it more similar to the one I've been using till now. I would like to put the shop address into the header, instead of order nr. and date. I tried to follow tuk66's instructions (previous page of this topic) and copying the smarty variables from footer to header in HTMLtemplateinvoice.php but I really can't get it work. Can someone help me? Thanks a lot! Edited November 22, 2014 by toncika (see edit history) Link to comment Share on other sites More sharing options...
eleazar Posted November 22, 2014 Share Posted November 22, 2014 (edited) Hi toncika, the easiest way in this case is to modify or override function getHeader() in classes/pdf/HTMLTemplate.php. Move line 75 to 78 from function getFooter() 'shop_address' => $shop_address, 'shop_fax' => Configuration::get('PS_SHOP_FAX', null, null, (int)$this->order->id_shop), 'shop_phone' => Configuration::get('PS_SHOP_PHONE', null, null, (int)$this->order->id_shop), 'shop_details' => Configuration::get('PS_SHOP_DETAILS', null, null, (int)$this->order->id_shop), to function getHeader() by adding it after e.g. line 58, so that the function will look like this: public function getHeader() { $shop_name = Configuration::get('PS_SHOP_NAME', null, null, (int)$this->order->id_shop); $path_logo = $this->getLogo(); $width = 0; $height = 0; if (!empty($path_logo)) list($width, $height) = getimagesize($path_logo); $shop_address = $this->getShopAddress(); this->smarty->assign(array( 'logo_path' => $path_logo, 'img_ps_dir' => 'http://'.Tools::getMediaServer(_PS_IMG_)._PS_IMG_, 'img_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'), 'title' => $this->title, 'date' => $this->date, 'shop_name' => $shop_name, 'shop_address' => $shop_address, 'shop_fax' => Configuration::get('PS_SHOP_FAX', null, null, (int)$this->order->id_shop), 'shop_phone' => Configuration::get('PS_SHOP_PHONE', null, null, (int)$this->order->id_shop), 'shop_details' => Configuration::get('PS_SHOP_DETAILS', null, null, (int)$this->order->id_shop), 'width_logo' => $width, 'height_logo' => $height )); return $this->smarty->fetch($this->getTemplate('header')); } If you want to make this an override, which will not be affected by further update, save the following as HTMLTemplate.php and upload it to /override/classes/pdf/ <?php class HTMLTemplate extends HTMLTemplateCore public function getHeader() { $shop_name = Configuration::get('PS_SHOP_NAME', null, null, (int)$this->order->id_shop); $path_logo = $this->getLogo(); $width = 0; $height = 0; if (!empty($path_logo)) list($width, $height) = getimagesize($path_logo); $shop_address = $this->getShopAddress(); this->smarty->assign(array( 'logo_path' => $path_logo, 'img_ps_dir' => 'http://'.Tools::getMediaServer(_PS_IMG_)._PS_IMG_, 'img_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'), 'title' => $this->title, 'date' => $this->date, 'shop_name' => $shop_name, 'shop_address' => $shop_address, 'shop_fax' => Configuration::get('PS_SHOP_FAX', null, null, (int)$this->order->id_shop), 'shop_phone' => Configuration::get('PS_SHOP_PHONE', null, null, (int)$this->order->id_shop), 'shop_details' => Configuration::get('PS_SHOP_DETAILS', null, null, (int)$this->order->id_shop), 'width_logo' => $width, 'height_logo' => $height )); return $this->smarty->fetch($this->getTemplate('header')); } } And if you modify a tpl-file for PDFs, you should duplicate the pdf directory before to your themes directory and change the files just in this place. Those modifications won't be affected by upgrades as well. Edited November 23, 2014 by eleazar (see edit history) Link to comment Share on other sites More sharing options...
toncika Posted November 22, 2014 Share Posted November 22, 2014 Thank you very much eleazar. Tried it now but doesn't work After coppying the strings as you written and saved the file, added a string in header tpl (the same that appear in footer.tpl) for getting shop address and details but I only managed to get the details and not the address :( Any idea? Link to comment Share on other sites More sharing options...
eleazar Posted November 23, 2014 Share Posted November 23, 2014 Silly me! I forgot to assign the content of the variable {shop_address}. Add this code $shop_address = $this->getShopAddress(); above the array which starts with this->smarty->assign(array( .... Or just use the now modified override. Link to comment Share on other sites More sharing options...
toncika Posted November 23, 2014 Share Posted November 23, 2014 Thank you very much eleazar, it works perfectly now! I would only like to change the format of the address, now it is name of shop - address - country I'd like to put it name of shop address country Tried to use the string tuk66 suggested on previuos page, $shop_address = str_replace("|", "<br>", AddressFormat::generateAddress($shop_address_obj, array(), '|', ' ')); inserting it in HTMLtemplate but it doesn't work. Would you please help me with this too? Thanks again Link to comment Share on other sites More sharing options...
eleazar Posted November 23, 2014 Share Posted November 23, 2014 Why so complicated? Forget this suggestion. Just use this code directly in header.tpl: {$shop_address|replace:"-":"<br>"} If the character to replace is not a "-" then feel free to use a different one. Link to comment Share on other sites More sharing options...
toncika Posted November 23, 2014 Share Posted November 23, 2014 So complicated because ... I'm not a CSS/PHP/HTML expert so I only read and try to use the information that I find. Thank you a lot, it works perfectly. I'd like to make two changes more: add shop url and shop email (the one inserted in Preferences > Store contacts) under the shop address. Have searched in HTMLtemplate but there is no string that refers to it... is it possible to do or would it mean too much work? The second thing is that I would like to insert the text written in Preferences > Store contacts > Registration under the order (product details). This text is - I think - what shop_details tab refers to, but don't how to insert it. Thanks again and again Link to comment Share on other sites More sharing options...
eleazar Posted November 24, 2014 Share Posted November 24, 2014 (edited) Okay, in this case we should make it be as less complicated as possible for you. To cut it short, no more modifying the Prestashop core. Let's just create 3 new translation items for fixed text.Wherever you want in header.tpl or invoice.tpl place a new item like e.g. the shop url: {l s='shop url' pdf='true'} Something like this in a table form in header.tpl: <td style="font-size: 12pt";>{l s='shop url' pdf='true'}</td> Something like this as a div-tag in invoice.tpl: <div>{l s='store contacts' pdf='true'}</div> The result will be three new translation items inlocalisation -> translations -> pdf In your back office. Fill in here, whatever you want. Edited November 24, 2014 by eleazar (see edit history) Link to comment Share on other sites More sharing options...
toncika Posted November 25, 2014 Share Posted November 25, 2014 Thanks eleazar, I used this method and it works great! I'm almost done with this invoice. I need just one more thing to set up... When a customer pays by COD, I'd like to have "COD payment: amount" on the right side of the delivery address. I already moved and changed the positions of the addresses but don't know how to write an "if" string to make it look like this: delivery address COD payment: xxx euro billing adress invoice etc Thank you again (imagine there's a flower-giving-smiley) Link to comment Share on other sites More sharing options...
eleazar Posted November 25, 2014 Share Posted November 25, 2014 Brat! Try something like this: <table style="width: 92%; font-size: 10pt; color: #000;"> <div style="font-size: 8pt; color: #444"> <tr> <td style="width: 4%"> </td> <td style="height: 105px;width: 40%"><br />{$invoice_address}</td> <td> </td> <td style="height: 105px;width: 40%;">{if !empty($delivery_address)}{l s='Delivery Address' pdf='true'}<br />{$delivery_address}{/if}</td> <td> </td> <td style="height: 105px;width: 16%;">{if $payment->payment_method == 'COD'}COD Payment: {displayPrice currency=$order->id_currency price=$order_invoice->total_paid_tax_incl}{/if}</td> </tr> </table> Link to comment Share on other sites More sharing options...
toncika Posted November 26, 2014 Share Posted November 26, 2014 Hmm.. tried it but does not work... I think that the reason is that I use CODfee module. I searched where payment methods are generated but didn't found, so I looked in CODfee module php and tried changing the above string in {if $payment->payment_method == 'codfee'}COD Payment: {displayPrice currency=$order->id_currency price=$order_invoice->total_paid_tax_incl}{/if} but nothing. Any idea? Thank you again!! Link to comment Share on other sites More sharing options...
eleazar Posted November 26, 2014 Share Posted November 26, 2014 Sorry, toncika, my fault. Should have tested this first. I applied the wrong variable. Try this instead; {if $order->payment == 'codfee'}COD Payment: {displayPrice currency=$order->id_currency price=$order_invoice->total_paid_tax_incl}{/if} I don't know if it's 'codfee' or 'COD' or whatevs. In any case you have to choose the payment displayed in your Back Office orders' list. Link to comment Share on other sites More sharing options...
toncika Posted November 26, 2014 Share Posted November 26, 2014 It doesn't work :( I the BO the payment method displayed is COD with fee, I tried all possible combinations - CODfee, Codfee, CodFee, codfee.... but doesn't work Link to comment Share on other sites More sharing options...
ldon Posted November 26, 2014 Share Posted November 26, 2014 It doesn't work :( I the BO the payment method displayed is COD with fee, I tried all possible combinations - CODfee, Codfee, CodFee, codfee.... but doesn't work Hi, can you add some image with the final result after applying all changes above? Thank you. Link to comment Share on other sites More sharing options...
eleazar Posted November 26, 2014 Share Posted November 26, 2014 It doesn't work :( I the BO the payment method displayed is COD with fee, I tried all possible combinations - CODfee, Codfee, CodFee, codfee.... but doesn't work Why?? Just do what I told you: you have to choose the payment name for COD displayed in your Back Office orders' list. Link to comment Share on other sites More sharing options...
toncika Posted November 30, 2014 Share Posted November 30, 2014 (edited) Hi, can you add some image with the final result after applying all changes above? Thank you. Hi Idon, I made more changes to my invoice template. You can find a photo of how it looks like here: https://www.dropbox.com/s/pohy1jdov59j9rg/pdf.jpg?dl=0 Edited November 30, 2014 by toncika (see edit history) Link to comment Share on other sites More sharing options...
toncika Posted November 30, 2014 Share Posted November 30, 2014 Why?? Just do what I told you: you have to choose the payment name for COD displayed in your Back Office orders' list. Hi eleazar, sorry for this late reply. In my BO orders list there is written Cash on delivery with fee but as I told you I can't get it work. Even if I put "Bank wire" instead of COD with fee and try to generate an invoice for a customer that choose Bank wire payment, there is no new line on the right side of the invoice. Maybe there is something wrong in my invoice template :( Link to comment Share on other sites More sharing options...
nanowax Posted December 19, 2014 Share Posted December 19, 2014 Hello, I need to edit invoice_addess , I need to add some labels before some text like Phone, dni, vat etc. On example: Company Name Name Surname ... PHONE nr.: 123456789 DNI: 987654321 VAT: XX147258369 Is there any solution how to achieve that (not in Countries at backoffice... that is not what I mean), like using varriables etc ? If it is not posible to solve this only for invoice, I haven't got problem, if the solution affects addresses in emails etc. Thank you in advance Link to comment Share on other sites More sharing options...
lorDoom Posted December 22, 2014 Share Posted December 22, 2014 (edited) Hello, I need to edit invoice_addess , I need to add some labels before some text like Phone, dni, vat etc. On example: Company Name Name Surname ... PHONE nr.: 123456789 DNI: 987654321 VAT: XX147258369 I use 1.6 presta, so maybe some arrays will be a litle bit different in classes/pdf/HtmlTemplateInvoice.php find function getContent() public function getContent() { $country = new Country((int)$this->order->id_address_invoice); $invoice_address = new Address((int)$this->order->id_address_invoice); $formatted_invoice_address = AddressFormat::generateAddress($invoice_address, array(), '<br />', ' '); $formatted_delivery_address = ''; if ($this->order->id_address_delivery != $this->order->id_address_invoice) { $delivery_address = new Address((int)$this->order->id_address_delivery); $formatted_delivery_address = AddressFormat::generateAddress($delivery_address, array(), '<br />', ' '); } $customer = new Customer((int)$this->order->id_customer); $data = array( 'order' => $this->order, 'order_details' => $this->order_invoice->getProducts(), 'cart_rules' => $this->order->getCartRules($this->order_invoice->id), 'delivery_address' => $formatted_delivery_address, 'invoice_address' => $formatted_invoice_address, 'tax_excluded_display' => Group::getPriceDisplayMethod($customer->id_default_group), 'tax_tab' => $this->getTaxTabContent(), 'customer' => $customer ); to $data = array you add line for each variable, as you can see in Country > adress, so you can add for example 'incompany_value' => $invoice_address->company, 'indni_value' => $invoice_address->dni, 'invat_value' => $invoice_address->vat_number, 'incountry_value' => $invoice_address->country, 'inmail_value' => $customer->email For creating variables for Company name, DNI and VAT, country and email (you can use all variables as firstname lastname etc) and in your invoice template you simply use VAT: {$invat_value} and you see f.e. VAT: XX147258369 Edited December 22, 2014 by lorDoom (see edit history) 1 Link to comment Share on other sites More sharing options...
eleazar Posted December 26, 2014 Share Posted December 26, 2014 (edited) You just need to create these 3 new variables: 'indni' => $invoice_address->dni, 'inphone' => $invoice_address->phone, 'invat' => $invoice_address->vat_number, The customer's country (if choosed for address), email address and company is already provided for the invoice, so you don't have to modify the core. Just get the information you need by using the following syntax directly in the invoice.tpl without any further changes: <strong>{l s='Mail'}: </strong>{$customer->mail} <strong>{l s='Company'}: </strong>{$customer->company} Or, if you don't use other languages than English and therefor don't need translation items: <strong>Mail: </strong>{$customer->mail} <strong>Company: </strong>{$customer->company} Edited December 27, 2014 by eleazar (see edit history) Link to comment Share on other sites More sharing options...
toncika Posted December 28, 2014 Share Posted December 28, 2014 Hi to everyone, I would like to delete the customer's phone number from the invoice, I've searched but can't found where the address is generated in order to delete this string. Can anyone help me? Thank you a lot! Link to comment Share on other sites More sharing options...
tuk66 Posted December 29, 2014 Share Posted December 29, 2014 The address is created according to the Address format set under Localization > Country (every). Link to comment Share on other sites More sharing options...
Bjornskov Posted December 29, 2014 Share Posted December 29, 2014 How do i set a fixed position for a div in the invoice? Following doesnt work. <div style="position:fixed; bottom:0; right:0; width:300px;"> {$invoice_address} </div> Link to comment Share on other sites More sharing options...
toncika Posted December 30, 2014 Share Posted December 30, 2014 The address is created according to the Address format set under Localization > Country (every). Thank you very much tuk66. I've searched in all php file but forgot to look in BO. No comment Why?? Just do what I told you: you have to choose the payment name for COD displayed in your Back Office orders' list. Eleazar, I've tried again and again, trying to modify also the string you wrote. I finally fixed it, the string that works is: {if !$order->payment->payment_method == 'CODfee'}COD payment: {displayPrice currency=$order->id_currency price=$order_invoice->total_paid_tax_incl}{/if} :) Link to comment Share on other sites More sharing options...
eleazar Posted December 31, 2014 Share Posted December 31, 2014 (edited) Eleazar, I've tried again and again, trying to modify also the string you wrote. I finally fixed it, the string that works is: {if !$order->payment->payment_method == 'CODfee'}COD payment: {displayPrice currency=$order->id_currency price=$order_invoice->total_paid_tax_incl}{/if} :) Toncika, a wise man once said: 'For every complex problem there is an answer that is clear, simple, and wrong.' Though this prob is of minor complexity, I'm afraid this statement fits. Just for the record: The "!" you added to the php statement is an abbreviation for 'NOT'. Which means, the if-clause has the following meaning: If the array defined by the database table order contains a field payment, that in turn points to an array field named payment method, is NOT named 'CODfee', then display COD payment: total price tax incl. The statement I proposed contained the following condition: {if $order->payment == 'CODfee'} As your (wrong) condition {if !$order->payment->payment_method == 'CODfee'} will never be the case, this works fine with COD payment in fact - but not only with COD payment! It will be displayed in any case, regardless of which payment the customer chose, because this condition will never be true. I'm sorry, but you've counted your chickens before they're hatched. Once again, you have to ask for the exact payment name in the language displayed in your BO. If you are not sure, maybe because the BO is run in a different language than your shop, use PHPMyAdmin and have a look into the field payment in your database table ps_orders. This field payment contains the name of the payment method you have to ask for in in the if-clause. Edited December 31, 2014 by eleazar (see edit history) Link to comment Share on other sites More sharing options...
toncika Posted January 1, 2015 Share Posted January 1, 2015 :( You're right eleazar. I just checked with other payments and obviously there is always the line on the invoice I'm giving up- The name of the module/payment method that I see in BO does not work, really. So if the string with ! says "write this if there is NO xy" can I use it to say "write COD payment=xx eur if there is no bank wire payment, no paypal payment, no cash payment"? Link to comment Share on other sites More sharing options...
eleazar Posted January 1, 2015 Share Posted January 1, 2015 I don't want you to post parts of your database, BO or the module here. But if you like, sent me a pm with an email contact. Maybe we find a solution. Link to comment Share on other sites More sharing options...
fong hong Posted January 12, 2015 Share Posted January 12, 2015 Is there Anyone can help me in this case.How can i add customer phone mobile at my Invoice Template (invoice.tpl) Below {$invoice_address}, What should i add the code?? Link to comment Share on other sites More sharing options...
domorodecmezilidmi Posted January 26, 2015 Share Posted January 26, 2015 (edited) Solved: How can customer messages be displayed in the pdf invoice? Jump to the bottom of this post for the solution - thanks to pointers from Bellini13! I'm looking for the method to display messages on the pdf invoice that are displayed in the order history and the BO order display. In the front office when a customer selects order history in the "My Account" block, the messages are displayed when they click on "details" in the order history table. This lead me to look at the code in order-details.tpl that displays the data on the screen. Below is that code that I tried to paste in the invoice.tpl file, but it didn't work. Any ideas how to make the messages display in the pdf invoice? {if count($messages)} <h3>{l s='Messages'}</h3> <div class="table_block"> <table class="detail_step_by_step std"> <thead> <tr> <th class="first_item" style="width:150px;">{l s='From'}</th> <th class="last_item">{l s='Message'}</th> </tr> </thead> <tbody> {foreach from=$messages item=message name="messageList"} <tr class="{if $smarty.foreach.messageList.first}first_item{elseif $smarty.foreach.messageList.last}last_item{/if} {if $smarty.foreach.messageList.index % 2}alternate_item{else}item{/if}"> <td> {if isset($message.elastname) && $message.elastname} {$message.efirstname|escape:'htmlall':'UTF-8'} {$message.elastname|escape:'htmlall':'UTF-8'} {elseif $message.clastname} {$message.cfirstname|escape:'htmlall':'UTF-8'} {$message.clastname|escape:'htmlall':'UTF-8'} {else} <b>{$shop_name|escape:'htmlall':'UTF-8'}</b> {/if} <br /> {dateFormat date=$message.date_add full=1} </td> <td>{$message.message|escape:'htmlall':'UTF-8'|nl2br}</td> </tr> {/foreach} </tbody> </table> </div> {/if} The solution: 1. Override the HTMLTemplateInvoice.php using the code below to place the customer messages in Smarty. This will lookup the messages, place assign them into smarty, and then return the standard invoice getContent. The file should be placed in the override/classes/pdf directory. <?php /* * Override for 1.5.4.1 HTMLTemplateInvoice.php to get order messages so they can be displayed in pdf invoice */ class HTMLTemplateInvoice extends HTMLTemplateInvoiceCore { public function getContent() { $this->smarty->assign(array( 'order' => $this->order, 'messages' => CustomerMessage::getMessagesByOrderId((int)($this->order->id), false), )); return parent::getContent(); } } 2. Insert the following code in the theme/pdf/invoice.tpl file. The location depends where you want the comments to display. For my invoice the code was inserted just before </table> <!-- / PRODUCTS TAB --> so the comments were displayed as the last item after the other sections of the invoice. <!-- / CUSTOMER MESSAGES --> <tbody> {if $messages} <b>Order Messages</b> {foreach from=$messages item=message name="messageList"} <tr class="{if $smarty.foreach.messageList.first}first_item{elseif $smarty.foreach.messageList.last}last_item{/if} {if $smarty.foreach.messageList.index % 2}alternate_item{else}item{/if}"> <hr><td> {if isset($message.elastname) && $message.elastname} {$message.efirstname|escape:'htmlall':'UTF-8'} {$message.elastname|escape:'htmlall':'UTF-8'} {elseif $message.clastname} {$message.cfirstname|escape:'htmlall':'UTF-8'} {$message.clastname|escape:'htmlall':'UTF-8'} {else} <b>{$shop_name|escape:'htmlall':'UTF-8'}</b> {/if} <br /> {dateFormat date=$message.date_add full=1} </td> <td>{$message.message|escape:'htmlall':'UTF-8'|nl2br}</td> </tr> {/foreach} {/if} </tbody> <!-- / CUSTOMER MESSAGES --> Hi, just a question is it also adaptable for PS 1.6? Edited January 26, 2015 by domorodecmezilidmi (see edit history) Link to comment Share on other sites More sharing options...
ghostp Posted February 25, 2015 Share Posted February 25, 2015 Yes, that is a good question! Is it adaptable for v1.6.0.13? Or is there any newer guide on how to edit the template??? Link to comment Share on other sites More sharing options...
domorodecmezilidmi Posted February 25, 2015 Share Posted February 25, 2015 1.6.0.13? ou my gosh, man, really don´t know, I am running under 1.6.0.6 and will not update till 1.6.1 is released. What U people have with never ending updates? Link to comment Share on other sites More sharing options...
eduard02 Posted March 25, 2015 Share Posted March 25, 2015 (edited) Okey I'm blind. I totally missed the "tools" folder, hehe. Anyways. On line 23.203 i have the following: } else { on 23.205 i have this: } On 24.618 this: $this->y += $this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'], 1, 'px'); and on 24.650 this if (isset($this->theadMargins['top'])) { m3442a .. can you post your lines from 24203 to 24205 and from 24618 to 24650 ? Hi, Thank you for this guide, great tutorial and invoice template. Can you please help me with these error, in back office --> orders --> when I want do view invoice for a client (attached printscreen). For the client in email invoice it's ok. PS 1.5.6.2 (no upgrade from 1.4) Thank you. Warning: Division by zero in /home/site-name/public_html/tools/tcpdf/tcpdf.php on line 22982 Warning: array_fill() [function.array-fill]: Number of elements must be positive in /home/site-name/public_html/tools/tcpdf/tcpdf.php on line 22984 Warning: Invalid argument supplied for foreach() in /home/site-name/public_html/tools/tcpdf/tcpdf.php on line 24393 Warning: Invalid argument supplied for foreach() in /home/site-name/public_html/tools/tcpdf/tcpdf.php on line 24425 Warning: Cannot modify header information - headers already sent by (output started at /home/site-name/public_html/tools/tcpdf/tcpdf.php:22982) in /home/site-name/public_html/tools/tcpdf/tcpdf.php on line 8966 TCPDF ERROR: Some data has already been output to browser, can't send PDF file Edited March 25, 2015 by eduard02 (see edit history) Link to comment Share on other sites More sharing options...
mattheoh Posted April 2, 2015 Share Posted April 2, 2015 Hi, is there a way to display the supplier in the invoice ? thanks to anyone who can help ! Link to comment Share on other sites More sharing options...
lapo78 Posted April 14, 2015 Share Posted April 14, 2015 Hi, how can i insert other product filed inside invoice? Thanks Link to comment Share on other sites More sharing options...
cikcak Posted April 15, 2015 Share Posted April 15, 2015 Hey, it is possible to add pagination to invoice? Link to comment Share on other sites More sharing options...
tuk66 Posted April 15, 2015 Share Posted April 15, 2015 What do you mean "pagination?" The invoice is automatically divided to more pages in case of large number of order items. Link to comment Share on other sites More sharing options...
cikcak Posted April 15, 2015 Share Posted April 15, 2015 What do you mean "pagination?" The invoice is automatically divided to more pages in case of large number of order items. Pagiation - if only 1 page it writes: 1 of 1 for example in footer. If 2 pages: on first page footer: 1 of 2 page , second page 2 - page. Link to comment Share on other sites More sharing options...
tuk66 Posted April 15, 2015 Share Posted April 15, 2015 (edited) I see now. Look at http://stackoverflow.com/questions/6452472/tcpdf-page-numbers-dont-align-properly or http://sourceforge.net/p/tcpdf/discussion/435311/thread/85ffca3e. Edited April 15, 2015 by tuk66 (see edit history) Link to comment Share on other sites More sharing options...
aliaspt Posted April 21, 2015 Share Posted April 21, 2015 I really liked the look of the invoice in the old Prestashop 1.3.1. I wonder if I could copy the code from it and paste into the new Prestashop pdf file? Or it would not be compatible? Link to comment Share on other sites More sharing options...
tuk66 Posted April 22, 2015 Share Posted April 22, 2015 No, you can't. The PS 1.3 and 1.6 invoices are completely different. Of course, PS 1.6 has some new things and improvements, so this is another reason. There are some 3rd party invoice templates and modules. For example, the M4 PDF Extensions module uses one invoice look in all PrestaShop versions. Link to comment Share on other sites More sharing options...
aliaspt Posted April 22, 2015 Share Posted April 22, 2015 No, you can't. The PS 1.3 and 1.6 invoices are completely different. Of course, PS 1.6 has some new things and improvements, so this is another reason. There are some 3rd party invoice templates and modules. For example, the M4 PDF Extensions module uses one invoice look in all PrestaShop versions. Thank you. Does the guide on the first page work for PS 1.6.09? I've already checked out your module. Link to comment Share on other sites More sharing options...
tuk66 Posted April 23, 2015 Share Posted April 23, 2015 No, it doesn't work, because that describes "different world" - FPDF library instead of TCPDF used in PS 1.6. Link to comment Share on other sites More sharing options...
skovbakke Posted May 3, 2015 Share Posted May 3, 2015 Hi,I actually posted this question before, but the thread never got any attention, so forgive me for re-posting it here. When I first posted I was on presto 1.5.4 but now I'm on 1.6.0.14.I've been trying to use the delivery slip to print out a packing list and an address label on one piece of paper. The paper I'm using has a dedicated peel-off section, where I place the delivery address, so it's ready to stick on the package right after packing.In order to place the address in a fixed position on the paper, I have put it in the footer of the delivery slip(by overriding) and adjusted it so it fits.This works very well if I print one delivery slip at the time, but since the idea was to save time and work, I would like to print all delivery slips once a day and bring them to the packing room to do all shipments in one round. When I try to do this, the addresses gets mixed up. The address in the footer is not the same as the address in the top of the delivery slip, -it's the same as the one on top of the following delivery slip! The last page of the deliveries.pdf is the only one that has the right address in the footer, -probably as there is no following slip to pull the address from.Seems to me that somehow the next footer is created before the active pdf is closed in the tcpdf workflow...that would be very illogical, but is there another explanation?What I've done is to override HTMLTemplateDeliverySlip.php by adding a function, getFooter(), that overrides the original getFooter() from HTMLTemplate.php. The new getFooter() simply fetches the delivery_address and uses a different template than footer.tpl to format it properly. Here's the override that I have in HTMLTemplateDeiverySlip.php: public function getFooter(){ $delivery_address = new Address((int)$this->order->id_address_delivery); $formatted_delivery_address = AddressFormat::generateAddress($this->delivery_address, array(), '<br />', ' '); $this->smarty->assign(array('delivery_address' => $formatted_delivery_address)); return $this->smarty->fetch($this->getTemplate('JSfooter_delivery'));} Seems simple enough, and it works, but unfortunately not for bulk printing. Any help is very welcome! Link to comment Share on other sites More sharing options...
Martijn++ Posted May 3, 2015 Share Posted May 3, 2015 Thank you. Does the guide on the first page work for PS 1.6.09? Yep, in principle it does. Works for me even with 1.6.0.14! Link to comment Share on other sites More sharing options...
aliaspt Posted May 4, 2015 Share Posted May 4, 2015 Thanks, guys. I've played with the HTML code and was able to achieve more or less desired look. Still need to figure out how to move the cells with order date, courier and payment method above the product summary table. If anybody is concerned about wasting your printer ink on background color while printing invoices and delivery slips, I've finally figured out how to add lines between table cells/rows. You will need to add CSS by inserting the following code above <table> <style type="text/css"> and then close it </table> </style> In every row where you want lines between rows (<td style=), add this: border:1px solid black; And then remove any background color. Link to comment Share on other sites More sharing options...
jhonzz007 Posted June 3, 2015 Share Posted June 3, 2015 Hi Supremacy2k, very nice tutorial. Is it possible to only display the header and footer on the first page and last page of invoice? Link to comment Share on other sites More sharing options...
eleazar Posted July 19, 2015 Share Posted July 19, 2015 Hi Supremacy2k, very nice tutorial. Is it possible to only display the header and footer on the first page and last page of invoice? Ok, I'm not Supremaczyk, but I can answer your question. Open /pdf/header.tpl Insert a <thead>-Tag right after the <table>-Tag and before closing it. Like this: <table style="width: 100%"> <thead> <tr> (...) </tr> </thead> </table> Repeat this for /pdf/footer.tpl That's all. Link to comment Share on other sites More sharing options...
codemayday Posted July 20, 2015 Share Posted July 20, 2015 Thanks for this guide, worked a treat! Link to comment Share on other sites More sharing options...
AdorablePaws Posted August 10, 2015 Share Posted August 10, 2015 First, let me say, I’m sorry for my poor English. I hope you understand my questions. I’m just about to open a small shop for dog supplies in Germany and I’m having problems with the look of the invoice. I read the modifications from Supremacy2k. I downloaded the header and invoice.tpl and already got stuck, because on the invoice.tpl I do not have 307 lines. I’m using Prestashop 1.6.1 . I really like the invoice Woutermesker uploaded here, but unfortunately he didn’t post his codes. For me it’s very important to have my company details on the invoice, such as company address and bank details, just like Woutermesker has. And I’d prefer the tax not to be mentioned again in the second table below the actual invoice table. Do you know what I mean? Anyone here who can help me? Link to comment Share on other sites More sharing options...
Alterni Posted September 13, 2015 Share Posted September 13, 2015 Hello, That was a good guide. Recently I tried changing the invoice template. In the original template, the product price that is displayed is excl tax. I want it to show incl tax. So, I changed the product_tab.tpl and the invoice .tpl accordingly and renamed it to product_tab2.tpl and invoice2.tpl. I uploaded it into the /PDF folder but when I went to the BO, i don't have the drop down list for the invoice2. FYI, I'm using custom Leo theme and it does have /PDF folder of its own but the only file is index.php and lang folder. I'm not to sure how to upload the new invoice template without removing the original template. I'd appreciate if you can help me on this matter. Thanks. Link to comment Share on other sites More sharing options...
eleazar Posted September 14, 2015 Share Posted September 14, 2015 Hello, FYI, I'm using custom Leo theme and it does have /PDF folder of its own but the only file is index.php and lang folder. I'm not to sure how to upload the new invoice template without removing the original template. I'd appreciate if you can help me on this matter. Thanks. You don't have to remove anything. Just upload your invoice2.tpl to the Leo theme's pdf folder. And if you use header and footer you have to add both tpl-files to this folder too. When done, the drop down will show your invoice. Link to comment Share on other sites More sharing options...
taydotech123 Posted September 29, 2015 Share Posted September 29, 2015 Hello, That was a good guide. Recently I tried changing the invoice template. In the original template, the product price that is displayed is excl tax. I want it to show incl tax. So, I changed the product_tab.tpl and the invoice .tpl accordingly and renamed it to product_tab2.tpl and invoice2.tpl. I uploaded it into the /PDF folder but when I went to the BO, i don't have the drop down list for the invoice2. FYI, I'm using custom Leo theme and it does have /PDF folder of its own but the only file is index.php and lang folder. I'm not to sure how to upload the new invoice template without removing the original template. I'd appreciate if you can help me on this matter. Thanks. you can find at PRESTASHOP_ROOT/pdf, all invoice template file are in there. Link to comment Share on other sites More sharing options...
seog Posted October 19, 2015 Share Posted October 19, 2015 Hello I tried delete margin of header.tpl in /classes/pdf/PDFGenerator.php changing code around line 200 but not work: public function writePage() { $this->SetHeaderMargin(5); to: public function writePage() { $this->SetHeaderMargin(0); How can delete header margin o delete header in invoice? Thank you very much best regards Link to comment Share on other sites More sharing options...
eleazar Posted October 20, 2015 Share Posted October 20, 2015 (edited) See to my post here: https://www.prestashop.com/forums/topic/213664-guide-modifying-prestashop-15-invoice-template/page-4?do=findComment&comment=1239375 And this post: https://www.prestashop.com/forums/topic/213664-guide-modifying-prestashop-15-invoice-template/page-2?do=findComment&comment=1116028 Use an override for your changes like described here: https://www.prestashop.com/forums/topic/213664-guide-modifying-prestashop-15-invoice-template/page-3?do=findComment&comment=1124703 Edited October 20, 2015 by eleazar (see edit history) Link to comment Share on other sites More sharing options...
seog Posted October 20, 2015 Share Posted October 20, 2015 See to my post here: https://www.prestashop.com/forums/topic/213664-guide-modifying-prestashop-15-invoice-template/page-4?do=findComment&comment=1239375 And this post: https://www.prestashop.com/forums/topic/213664-guide-modifying-prestashop-15-invoice-template/page-2?do=findComment&comment=1116028 Use an override for your changes like described here: https://www.prestashop.com/forums/topic/213664-guide-modifying-prestashop-15-invoice-template/page-3?do=findComment&comment=1124703 Hello, thank you very much for info. I tried this changes but header margin still persists: PDF.php line 92= /**$this->pdf_renderer->createHeader($template->getHeader());*/ PDFGenerator.php line 200 = /**$this->SetHeaderMargin(0, 0, 0);*/ Some other changes to make? best regards PS 1.6.1.1 Link to comment Share on other sites More sharing options...
eleazar Posted October 20, 2015 Share Posted October 20, 2015 You seem to have read my post, but it's like Mark 4:12, to quote the Bible. To cut it short: Change the second parameter in $this->setMargins(10, 40, 10); of PDFGenerator.php to zero, open any invoice and watch what happens. Link to comment Share on other sites More sharing options...
seog Posted October 20, 2015 Share Posted October 20, 2015 ok, now works. I thought deleting header code could work Do you know asign min-height for global table? I tried also in tr and td with min-height and display:block but didnt work Link to comment Share on other sites More sharing options...
Housy Posted October 30, 2015 Share Posted October 30, 2015 Hello guys Why am i not able to override PDFGenerator.php file? Under "Override/classes/pdf/" i have created the same file, which is PDFGenerator.php. Within that file i have put code below, because i want to define different header and footer height. The problem is, that override doesn't work at all, even if i disable cache and delete class_index.php file within cache directory. What am i doing wrong? Is there maybe a bug or something? <?php class PDFGeneratorCoreOverride extends PDFGeneratorCore { /* Header and Footer HEIGHT change */ public function writePage() { $this->SetHeaderMargin(10); $this->SetFooterMargin(30); $this->setMargins(10, 40, 10); $this->AddPage(); $this->writeHTML($this->content, true, false, true, false, ''); } } I am using Prestashop version 1.6.0.14. If i change code directly, it affects PDF, when it is exported. It works as it should but no results, when overriding PDFGenerator.php file.Could you guys take a look and help me here please?Thank you and best regards,Housy Link to comment Share on other sites More sharing options...
eleazar Posted October 31, 2015 Share Posted October 31, 2015 Drop the "Override", only necessary for module overrides. Just write class PDFGenerator extends PDFGeneratorCore Link to comment Share on other sites More sharing options...
bonsaiko Posted November 18, 2015 Share Posted November 18, 2015 Does anyone know how to change the footer only of the delivery file ? I made changes to footer.tpl, but both invoices and delivery files are modified... Thanks Link to comment Share on other sites More sharing options...
DanAndrei Posted December 7, 2015 Share Posted December 7, 2015 (edited) Hi Guys, I am using PS1.5.6.2. Can I add a second page on my invoice. The second page will contain a text. I will then print the invoice in duplex mode. Thanks, Dan Edited December 7, 2015 by DanDobras (see edit history) Link to comment Share on other sites More sharing options...
luca82 Posted April 29, 2016 Share Posted April 29, 2016 It is possible modify the address of invoice? I'd like change the order of name and company. The order is the following Company Name Address complete I think must change php file. But I don't know which file. Thank you very much Link to comment Share on other sites More sharing options...
Stephane P Posted July 28, 2016 Share Posted July 28, 2016 Any idea on how to add manufacturer + product description on PrestaShop 1.6 ? I'm struggling with that Thank you Link to comment Share on other sites More sharing options...
prestatent Posted August 17, 2016 Share Posted August 17, 2016 PS 1.6.1.1 Hi This post has almost got me there. If I modify the core file it works ok, but to do this correctly I need it to be in an override. However in the override in 1.6 the code is different from 1.5. See below: $data = array( 'order' => $this->order, 'order_invoice' => $this->order_invoice, 'order_details' => $order_details, 'cart_rules' => $cart_rules, 'delivery_address' => $formatted_delivery_address, 'invoice_address' => $formatted_invoice_address, 'addresses' => array('invoice' => $invoice_address, 'delivery' => $delivery_address), 'tax_excluded_display' => $tax_excluded_display, 'display_product_images' => $display_product_images, 'layout' => $layout, 'tax_tab' => $this->getTaxTabContent(), 'customer' => $customer, 'footer' => $footer, 'ps_price_compute_precision' => _PS_PRICE_COMPUTE_PRECISION_, 'round_type' => $round_type, 'legal_free_text' => $legal_free_text, 'messages' => CustomerMessage::getMessagesByOrderId((int)($this->order->id), false), ); if (Tools::getValue('debug')) { die(json_encode($data)); } $this->smarty->assign($data); $tpls = array( 'style_tab' => $this->smarty->fetch($this->getTemplate('invoice.style-tab')), 'addresses_tab' => $this->smarty->fetch($this->getTemplate('invoice.addresses-tab')), 'summary_tab' => $this->smarty->fetch($this->getTemplate('invoice.summary-tab')), 'product_tab' => $this->smarty->fetch($this->getTemplate('invoice.product-tab')), 'tax_tab' => $this->getTaxTabContent(), 'payment_tab' => $this->smarty->fetch($this->getTemplate('invoice.payment-tab')), 'total_tab' => $this->smarty->fetch($this->getTemplate('invoice.total-tab')), ); $this->smarty->assign($tpls); return $this->smarty->fetch($this->getTemplateByCountry($country->iso_code)); return parent::getContent(); I know the bottom line: return parent::getContent(); is in the wrong place. Where should it go? Thanks for any and all help. Link to comment Share on other sites More sharing options...
prestatent Posted August 17, 2016 Share Posted August 17, 2016 Got it. Should have tried this first. For anyone who's interested: class HTMLTemplateInvoice extends HTMLTemplateInvoiceCore { /** * Returns the template's HTML content * * @return string HTML content */ public function getContent() { $msgdata = array( 'messages' => CustomerMessage::getMessagesByOrderId((int)($this->order->id), false), ); $this->smarty->assign($msgdata); return parent::getContent(); } /** * Returns the tax tab content * * @return String Tax tab html content */ } Link to comment Share on other sites More sharing options...
My Power Posted September 6, 2016 Share Posted September 6, 2016 (edited) Very usefull. Edited September 6, 2016 by My Power (see edit history) Link to comment Share on other sites More sharing options...
DraghiciA Posted September 20, 2016 Share Posted September 20, 2016 This works on 1.6 version? Link to comment Share on other sites More sharing options...
rubenshish Posted September 29, 2016 Share Posted September 29, 2016 <Thanks Link to comment Share on other sites More sharing options...
stoner666 Posted January 20, 2018 Share Posted January 20, 2018 hello guys can someone help me with dates problem, in my country invoice must have some formailities, with are not included in basic invoice, many of them are easily achiveable, but I have problem with due date. I need to achieve, that I have on my invoice creation date (included in basic invoice), "date of payment" (this could be same as creation date) and due date, with should be for example date of creation + additional 7 days and I don't know, how in smarty I can create it. I need something like {dateFormat date=$order->date_add"+ 7 days" full=0} but I don't know, how should this code look like to working Someone knows ? thx Link to comment Share on other sites More sharing options...
eleazar Posted January 20, 2018 Share Posted January 20, 2018 Hello @stoner666, the PHP code you are looking for is: {"+1 week"|strtotime|date_format:"d.m.Y"} A short synopsis of the php date format I posted here (in German): https://www.prestashop.com/forums/topic/241513-tipp-datumsformat-richtig-erfassen/. Or you might prefer this longer tutorial in English: https://secure.php.net/manual/de/datetime.formats.date.php If the pdf creation date is ok for you, use this Smarty code: {$smarty.now|date_format:"%d.%m.%Y"} Depending on your country maybe you need to change the date format. If you don't know how, folow this Link: https://www.smarty.net/docsv2/de/language.modifier.date.format.tpl Things like this and more you'll find in this pdf template I posted in my own thread to change the invoice (in the German forum): https://www.prestashop.com/forums/topic/244719-tutorial-rechnungsformular-ändern-für-version-15x-und-16x/ Link to comment Share on other sites More sharing options...
stoner666 Posted January 21, 2018 Share Posted January 21, 2018 Hello eleazar, nice solution, it solves emailed and printed invoices but I suppose, this date is changing everytime, you download invoice from backoffice, so I have to print this invoice same date as is sent to customer to have exactly same document. Thank you Link to comment Share on other sites More sharing options...
eleazar Posted January 21, 2018 Share Posted January 21, 2018 Ok, then use instead of a simple Smarty date this code: {if $order_invoice->date_add < $smarty.now|date_format}{dateFormat date=$order_invoice->date_add full=0}{else}{$smarty.now|date_format:"%d.%m.%Y"}{/if} Link to comment Share on other sites More sharing options...
RabbitZzZ Posted March 4, 2019 Share Posted March 4, 2019 Does anyone know if there is a possibility to check the shipping zone of the delivery address in the invoice template? The idea is to show foreign customers a special message on the invoice. Thanks! Link to comment Share on other sites More sharing options...
tuk66 Posted April 12, 2019 Share Posted April 12, 2019 It should be possible. I do something similar in another kind of templates, but the core is the same. {assign var='eu_countries' value="AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,DE,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,GB"} {assign var="eu_iso" value=","|explode:$eu_countries} {assign var="default_zone" value=Country::getIdZone($r_order.shop.country_default)} {assign var="country_zone" value="`$r_order.address_delivery.country.id_zone`"} {assign var="country_iso" value=Country::getIsoById($r_order.address_delivery.id_country)} {assign var="is_default_zone" value="`$default_zone == $country_zone`"} {assign var="is_default_country" value="`$r_order.shop.country_default == $r_order.address_delivery.country.id_country`"} {if in_array($country_iso, $eu_iso)}{assign var="is_eu" value=1}{else}{assign var="is_eu" value=0}{/if} {if !$is_eu} {$note_outside_eu|escape:'htmlall':'UTF-8'} {elseif $is_eu && !$is_default_country && $without_tax} {$note_inside_eu|escape:'htmlall':'UTF-8'} {/if} Just use different variables. Link to comment Share on other sites More sharing options...
Monikatexty Posted February 14, 2021 Share Posted February 14, 2021 Hello. IT is possible to add tax rate in product list tab? For example : unit price wo/t. tax rate discount total 20€. 20%. 0. 24€ thanks Link to comment Share on other sites More sharing options...
Jacks110 Posted July 2, 2021 Share Posted July 2, 2021 Hello, Please help. How to add image or logo in the header in invoice. Thanks a lot. Link to comment Share on other sites More sharing options...
fatihyuce Posted May 20, 2022 Share Posted May 20, 2022 Hello, I have edited my invoice, I have no problem for a single page. However, in multiple orders, I want the address and invoice date to appear again on the 2nd and other pages. How can I do this, thank you in advance. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now