Jump to content

Ajouter Champ(s) dans Facture PDF


Recommended Posts

Bonjour,

 

Après des heures de manipulation et de recherche, je post :

 

j'ai lu pas mal de post sur le forum et ailleurs mais ca ne fonctionne pas. 

 

 

Dans un premier temps, je souhaite ajouter la description courte (product_lang.description_short) à la suite du nom du produit dans la facture PDF. 

 

J'ai éditer invoice.product-tab.tpl afin d'y ajouter tout bêtement {$order_detail.description_short} mais la description ne s'affiche pas. (alors que dans ce post, il l'ajout et ca marche....  :angry:)

 

J'ai donc regardé du côte de HTMLTemplateInvoice.php, j'ai tenté de déclaré un nouvel appel en base avec la fonction getProductsDetail() en ajoutant un jointure sur la table product_lang puis modifié le .tpl mais la encore, ca ne fonctionne pas.

 

Est-ce que quelqu'un peut m'aider ? Merci d'avance,

 

Version prestashop : 1.6.1.3

Link to comment
Share on other sites

  • 3 weeks later...
  • 2 months later...

La description des produits n'est pas disponible dans l'objet order_detail, ni dans aucune autre variable passée au template de facture. Cet objet récupère les données de la table ps_product, mais pas celles de la table ps_product_lang, où se trouve la description courte.

 

Par contre, l'identifiant du produit est disponible. Le plus "propre" (récupérer les données depuis une classe du modèle, et non depuis le contrôleur du template de facture HTMLTemplateInvoice) serait de créer une méthode getProductsDetailWithDescription dans une surcharge de OrderInvoice, et de reprendre la méthode existante getProductsDetail en ajoutant une jointure à la table ps_product_lang.

 

Peut-être y a t-il plus simple, mais c'est ce que je ferai à première vue.

Link to comment
Share on other sites

  • 1 month later...
  • 10 months later...

Bonjour,

je tombe sur ce sujet qui est exactement mon problème actuel, mais je n'ai pas trouvé solution dans ces discussions... Y'a-t-il un moyen que le fichier invoice.product-tab.tpl prenne en compte le champ product_lang.description_short de façon à ce que la description courte s'affiche dans la facture ?

Merci de vos réponses

Link to comment
Share on other sites

Bonjour,

 

Rajoutez ce code dans un fichier override/classes/order/OrderInvoice.php :

class OrderInvoice extends OrderInvoiceCore
{
    public function getProductsDetail()
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
            (new DbQuery())
                ->select('*')
                ->from('order_detail', 'od')
                ->leftJoin('product', 'p', 'p.id_product = od.product_id')
                ->leftJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = od.id_shop')
                ->leftJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = '.Context::getContext()->language->id)
                ->where(
                    'od.id_order = '.(int)$this->id_order.
                    ($this->id && $this->number ? ' AND od.`id_order_invoice` = '.(int)$this->id : '')
                )
                ->orderBy('od.product_name')
        );
    }
}
Edited by GuillaumeCW (see edit history)
Link to comment
Share on other sites

Merci de cette réponse... mais j'ai dû rater une étape car ça ne marche pas... voici ce que j'ai fait :

- j'ai créé un fichier OrderInvoice.php, que j'ai placé dans le dossier override/classes,

- dans le fichier pdf/invoice.product-tab.tpl j'ai inclus la ligne : <br>{$product_lang.description_short} après la ligne {$order_detail.product_name}

Merci d'avance de vos éclaircissements...

 

                               

 

Link to comment
Share on other sites

Bonjour et merci de cette indication, j'ai donc changé ma ligne de commande dans le fichier pdf/invoice.product-tab.tpl

Mais ça ne marche pas...

Je me demande si mon fichier OrderInvoice.php est bien placé... (au premier plan de override/classes) il est juste à côté d'un fichier index.php et de plusieurs dossiers lesquels ne contiennent qu'un fichier index.php chacun... et est-ce normal qu'il n'existait pas auparavant et que je l'ai créé de toute pièce (en faisant un copié collé du code que vous avez posté plus haut) ?

Merci d'avance pour votre aide !

Link to comment
Share on other sites

Bonjour,

je n'ai pas pu tester avant mais merci de la réponse rapide...

Désolée de vous embêter encore, mais j'ai pourtant bien suivi les instructions me semble-t-il, et ça ne fonctionne toujours pas...

Je résume mes actions :

- dans le dossier override/classes/order, rajout du fichier OrderInvoice.php qui est un copié-collé du code fourni plus haut

- dans le fichier pdf/invoice.product-tab.tpl, j'ai rajouté la ligne

<br>{$order_detail.description_short}

juste après la ligne

{$order_detail.product_name}

J'ai testé avec un nouveau produit, qui comporte bien un résumé et une description, mais si le product_name apparait bien dans le pdf, le description_short n'apparait toujours pas...

Si vous avez une idée d'où ça coince... ?

Merci merci...

Link to comment
Share on other sites

Bonjour,

merci de l'info, je viens de le faire, puis de recharger la facture pdf mais toujours rien... j'ai toujours une ligne blanche à la place de mon info de résumé...

en fouillant un peu j'ai vu qu'il y avait déjà un fichier OrderInvoice.php dans classes/order... j'ai mis le nouveau dans override/classes/order... c'était bien ça ?

pour info, j'ai testé une création de nouveau champ directement dans la base de données dans la table order_detail, et dans ce cas-là ma facture pdf la prend bien en compte... mais comment relier automatiquement mon champ description_short, ça n'est toujours pas résolu...

Merci d'avance de votre aide si vous voyez où peut être le hic !? très bonne journée !

Link to comment
Share on other sites

en fouillant un peu j'ai vu qu'il y avait déjà un fichier OrderInvoice.php dans classes/order... j'ai mis le nouveau dans override/classes/order... c'était bien ça ?

C'est probablement le fichier dont vous parliez dans le commentaire #12.

 

Je n'ai pas d'autres idées sinon, à part si vous avez plusieurs langues installées/activées pour la boutique, et que la description courte du produit dans la facture n'est pas remplie dans la langue de votre compte employé.

 

Bon courage pour arriver à trouver la solution.

Link to comment
Share on other sites

RE-bonjour... ça y est !

Avec un peu de persévérance et de remise en état de mon cerveau, j'ai trouvé le hic...

J'avais tout simplement oublié d'insérer la commande <?php au début de mon nouveau fichier OrderInvoice.php !

Encore un petit coup de suppression des caches a alors été nécessaire et maintenant ça marche tout bien.

Merci beaucoup pour le code, les astuces et la patience, mon problème est résolu et du coup j'ai appris plein de trucs !

Très bonne fin de journée !

Link to comment
Share on other sites

  • 5 months later...

Bonjour à vous 

je voulais moi aussi ajouter le champs description dans ma facture j'ai donc fait comme dit ci dessus 

c'est a dire que j'ai crée un fichier php :OrderInvoice.php que j'ai upload ds : override/classes/order

<?php
/**
*Ajout du champ description court sur facture
*/

class OrderInvoice extends OrderInvoiceCore
{
    public function getProductsDetail()
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
            (new DbQuery())
                ->select('*')
                ->from('order_detail', 'od')
                ->leftJoin('product', 'p', 'p.id_product = od.product_id')
                ->leftJoin('product_shop', 'ps', 'ps.id_product = p.id_product AND ps.id_shop = od.id_shop')
                ->leftJoin('product_lang', 'pl', 'pl.id_product = p.id_product AND pl.id_lang = '.Context::getContext()->language->id)
                ->where(
                    'od.id_order = '.(int)$this->id_order.
                    ($this->id && $this->number ? ' AND od.`id_order_invoice` = '.(int)$this->id : '')
                )
                ->orderBy('od.product_name')
        );
    }
}

?>

puis je suis allé sur le fichier  pdf/invoice.product-tab.tpl

et j'ai modifié comme ceci (là j'ai un doute sur le choix du positionnement de la ligne )

 

<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}
                               
<br>{$order_detail.description_short}
                            </td>

et quand je simule une commande mon PDF n'a rien aucune description courte qui s'affiche j'ai bien vidé le cache mais n'ai pas de cache/class_index ... je suis sous version 1,7,0

si vous avez une idée de mon erreur je suis preneur 

Edited by fp2 (see edit history)
Link to comment
Share on other sites

Bonjour, je ne sais pas si ma réponse sera efficace car non informaticienne je fonctionne par tatonnements et je suis toujours étonnée quand mes problèmes se résolvent mais bon, le feeling fait que ça se résoud toujours... j'avais donc résolu cette question, je n'ai plus trop l'esprit dedans mais je viens de comparer exactement mes fichiers avec les vôtres, voici les petites différences :

dans OrderInvoice.php, c'est tout pareil sauf que de mon côté je n'ai pas fermé avec    ?>    à la fin

dans invoice.product-tab.tpl, c'est la même séquence sauf que je n'ai pas mis le   <br>    avant {$order_detail.description_short}

honnêtement je ne vois pas trop pourquoi ces différences poseraient problème, mais bon... sait-on jamais ?

Link to comment
Share on other sites

il y a une heure, rachpat a dit :

Bonjour, je ne sais pas si ma réponse sera efficace car non informaticienne je fonctionne par tatonnements et je suis toujours étonnée quand mes problèmes se résolvent mais bon, le feeling fait que ça se résoud toujours... j'avais donc résolu cette question, je n'ai plus trop l'esprit dedans mais je viens de comparer exactement mes fichiers avec les vôtres, voici les petites différences :

dans OrderInvoice.php, c'est tout pareil sauf que de mon côté je n'ai pas fermé avec    ?>    à la fin

dans invoice.product-tab.tpl, c'est la même séquence sauf que je n'ai pas mis le   <br>    avant {$order_detail.description_short}

honnêtement je ne vois pas trop pourquoi ces différences poseraient problème, mais bon... sait-on jamais ?

Merci en fait je me rends compte que ma réponse n'est pas passée, j'ai trouvé d'où cela venais 'avais prix ds commande/facture l'option" invoiceb2b" donc mes modifications n'étaient pas prisent en compte une fois ds commande/facture l'option "invoice" sélectionné tout fonctionne parfaitement .

 

Mais merci pour l'aide 

Link to comment
Share on other sites

  • 2 years later...

Bonjour,

pour ma part j'ai mis dans override/classes/order/OrderInvoice.php

avec le code suivant

<?php

class OrderInvoice extends OrderInvoiceCore
{
  //ajouter la requette pour afficher aussi les descriptions des produits dans le pdf
    public function getProductsDetail()
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
        SELECT *
        FROM `' . _DB_PREFIX_ . 'order_detail` od
        LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.id_product = od.product_id
        LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` b ON (b.id_product = od.product_id AND b.id_lang = od.id_shop)
        LEFT JOIN `' . _DB_PREFIX_ . 'product_shop` ps ON (ps.id_product = p.id_product AND ps.id_shop = od.id_shop)
        WHERE od.`id_order` = ' . (int) $this->id_order . '
        ' . ($this->id && $this->number ? ' AND od.`id_order_invoice` = ' . (int) $this->id : '') . ' ORDER BY od.`product_name`');
    }
}

la modification ajouté par rapport à l'origine est l'ajout de tous les champs de product_lang du coup vous pouvez appeler {$order_detail.champdelatable}

puis dans mon .tpl du pdf la variable smarty

{$order_detail.description_short}

et ça fonctionne correctement.

en espérant que ça puisse aider d'autres personnes.

 

Link to comment
Share on other sites

  • 2 years later...

Bonjour à tous .
je reviens sur ce sujet pour apporter une petite précision.
En effet, dans mon cas ça ne fonctionnait pas quand je modifiait le "invoice.product-tab.tpl"

pourtant je mettais bien    <br>{$order_detail.description_short} après la ligne {$order_detail.product_name}

seulement voilà, cette ligne ({$order_detail.product_name}) se trouve à 2 endroits.

On la retrouve un peu plus bas entre {else} et {/if}.

et c'est en la plaçant sous cette seconde ligne que ça a fonctionné.

Donc ça donne :

 

            </td>
                            <td width="5%">&nbsp;</td>
                            <td width="80%">
                                {$order_detail.product_name}
                            
                            </td>
                        </tr>
                    </table>
                {else}
                    {$order_detail.product_name}

                    <br>{$order_detail.description_short}

                {/if}

            </td>

 

Une fois que cette modification est faite, allez (sur votre serveur) dans le dossier "cache" pour supprimer class_index.php.
Puis retourner sur votre BackOffice Prestashop.
Faites "rafraichir votre navigateur (actualiser la page)"

Retournez dans une commande pour éditer votre facture, et ça devrait fonctionner

 

PS : pour ma part avec la ligne <br>{$product_lang.description_short}, proposée par certains ça ne fonctionnait pas

 

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...