Jump to content

[Résolu] Créer un pdf personnalisé pour pièce jointe


Recommended Posts

Bonjour à tous,

Pour un de mes modules perso je dois générer un pdf et l'attacher en piece jointe d'un mail.

J'ai beau chercher je ne trouve pas grand chose. Y'a t'il une fonction native de Prestashop qui gère la création d'un fichier PDF ? 

Par exemple une fonction pdf(arg1, arg2) qui créer un pdf à partiir d'un fichier (tpl ?) ou de données. 
 

En très gros mon module permet au client sur une page de choisir des options et de se les envoyer par mail. J'aimerais améliorer ça en mettant les infos dans un pdf et ensuite mettre le pdf en piece jointe (et non les infos dans le corps du mail).

Si quelqu'un peut m'aider ça serait super :) 

Merci d'avance ! 

Cordialement,

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

Hello ! 

Prestashop a quelques classes natives qui créent des pdf, mais surtout pour des factures ou des BL. 

Si tu comprends l'anglais, je pense que ce lien pourra grandement t'aider pour 'customiser' tes pdf (: 

--> http://blog.belvg.com/pdf-in-prestashop.html C'est pour une version 1.5, mais il n'y pas grand-chose qui a changé dans 1.6, à part certains appels Smarty, certains noms de fonctions/classes/hooks qui ont changé aussi (bon, il y a beaucoup de trucs qui ont changé, mais on peut continuer à s'appuyer sur la doc 1.5 quand même ). 

Dans ce tuto, il te propose de créer des pdf à uploader, donc ce n'est pas tout à fait ton cas, mais si ça peut te servir... 

Si je ne dis pas de bêtises, dans /classes/pdf/pdf.php et pdfGenerator.php tu devrais trouver ton bonheur ( = les fonctions qui gèrent les pdf sur presta).

Pour la suite, pour joindre une pièce jointe à un mail, tu peux utiliser Mail::Send() ou sinon, regarde dans /tools/swiftmailer/  (prestashop utilise cette library pour envoyer ses mails, autant en profiter pour se simplifier la vie). 

 

En espérant avoir pu t'aider un peu, 

Cordialement,

Okar

Link to comment
Share on other sites

Bonjour,

 

Tu peux aussi t'intéresser à la libraire utilisée par Prestashop pour générer ces fameux PDF, c'est FPDF.

 

Elle est facile d'utilisation et de nombreux tutoriels sont disponibles sur le net si  tu veux te lancer :)

 

Attention néanmoins cette libraire n'est plus disponible à partir de Prestashop 1.6, elle est remplacée par TCPDF...

Link to comment
Share on other sites

Oui j'ai commencé justement à regarder cette fameuse librairie. 

Là pour l'instant j'arrive à générer mon PDF, j'ai commencé la mise en forme etc.

Par contre je n'arrive pas encore à passer des variables à mon template de PDF et je n'arrive pas à joindre mon PDF en pièce jointe dans la fonction Mail::Send().

Je vais continuer de chercher.




EDIT : j'ai réussi à joindre le pdf que je génère en pièce jointe dans la fonction Mail::Send() :)

Maintenant je n'ai plus qu'à trouver comment fournir des variables à mon template de PDF pour avoir un PDF remplis de bonnes informations 

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

Hello,

Pour Mail::Send(), je crois que la syntaxe c'est $file->Attach($mapiecejointe);

ou $file->AddAttachment($mapiecejointe); (ou addAttachment, au niveau de la casse)...

 

[EDIT] j'avais pas vu ton edit ^^ au temps pour moi ! [/EDIT]

 

Pour passer des variables dans un template, regarde du côté de Smarty, c'est plutôt simple à comprendre (cf. la doc officielle de Smarty).

tu as certaines variables globales à smarty/prestashop ->http://ad-creatif.com/liste-de-variables-globales-smarty-pour-prestashop/ (bon, ça date de 2013, mais je pense que les variables globales n'ont pas du trop changer entre 1.5 et 1.6), et tu peux faire des affichages conditionnels avec {if}{else}{/if} dans le template. Pour afficher une variable = {$mavariable} , initialisée dans ton code php. Pour les assigner, de mémoire, c'est $smarty->assign('mavariable',$lavariable);

Pour faire passer des variable d'un côté et de l'autre, il y a la bonne classe Tools (dans /classes/Tools.php) qui te permet de récupérer des valeurs et de les utiliser ensuite.

Comme l'a signalé Ornicar, oui, la librairie FPDF sert aussi, je l'avais oublié, en 1.5 (:

 

Bon développement !

 

Okar

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

Merci de ton aide ! 

Alors pour Mail::Send() j'ai réussi, effectivement avec une variable $file_attachement comme ceci 
 

      $pdf = new PDF($custom_object, 'CustomPdf', Context::getContext()->smarty);
      $file_attachement['content'] = $pdf->render(false);
      $file_attachement['name'] = 'test.pdf';
      $file_attachement['mime'] = 'application/pdf';
 
puis en mettant la variable $file_attachement en parametre dans Mail::Send


Pour le passage de variables d'habitude je n'ai pas de problème mais là c'est un peu particuliers, en effet pour résumer je travaille sur un module que j'ai créé, ce module permet au client de configurer un produit sur mesure en choisissant pas mal d'options. Les choix du client sont traités en AJAX afin de créer un récap à la fin de la page (avec un calcul du prix, etc).
Vient ensuite un bouton "envoyer par mail" qui lui permet de tout envoyer sur son mail (et le mail de la boite (c'est un devis en fait)).

Je traite donc le tout dans mon controller avec une fonction postProcess() qui récupère toutes les infos, et envois des mails.
 
J'aimerais donc enrichir ma fonction PostProcess avec :
1) transmission de variables au template  PDF  (ce que je cherche à faire)
2) pièce jointe avec le pdf (ce que j'ai réussi)
 
j'ai tenté un $this->context->smarty->assign(array('XXX' => $var, etc )); avec un $this->setTemplate('templatePDF.tpl');

Mais apparemment j'ai une exception Prestashop "template not found" pourtant le chemin est bon :/ 


Désole pour ce pavé :/ J'essaie juste d'être le plus précis possible (c'est pas facile d'expliquer tout ça ^^)

Merci !
Link to comment
Share on other sites

"[..]J'aimerais donc enrichir ma fonction PostProcess avec :
1) transmission de variables au template  PDF  (ce que je cherche à faire)[...]"

 

>En fait, ton "template PDF", ce serait ta pièce jointe, c'est bien ça ?

Je sais pas si ça marche, j'ai pas trop le temps de tester aujourd'hui (plein de trucs à faire ^^ ), mais si tu crées un controller qui contient une méthode initContent() où tu assignes tes variables smarty et que tu setTemplate() ton pdf dedans, il y a moyen que ça marche (c'est une rélfexion, rien de très concret).

 

Genre dans  moncontroller.php:

initContent()

{

$this->context->smarty->assign(array('XXX' => $var, etc )); //et init chaque variable comme ça

$this->setTemplate('templatePDF.tpl');

}

 

Je me pose une question, ton tpl pdf, tu l'as mis à la racine de ton module ? Ou dans un sous-dossier ?

S'il est à la racine, sait-on jamais, testes avec './templatePDF.tpl'  (normalement, ça devrait marcher avec juste 'templatePDF.tpl', mais j'ai eu le souci de chemin, une fois, sur un tpl créé aussi, et j'avais pu régler mon problème avec ça).

 

>Une autre question : ton client remplit une sorte de formulaire, et tu récupères tes variables en AJAX, c'est ça?

J'suis pas assez calée en ajax pour pouvoir t'aider, par contre, désolée :-/ A moins de les traiter en ajax directement et de les faire passer à smarty mais je ne vois pas trop comment...

Sinon, tu peux récupérer tes variables en php directement, il y a Tools::getValue() pour toute donnée passée dans un formulaire (en POST ou en GET).

Tiens-moi au jus si ça marche, et comment tu t'es débrouillé (:

 

Bonne journée (et bon appétit),

 

Okar

Link to comment
Share on other sites

Mon template PDF c'est le tpl à partir duquel est créé mon PDF (en fait mon PDF est même créé à partir de 3 TPL : header / content / footer).

Donc oui ma pièce jointe c'est le PDF que je génère une fois que le client à remplit la page (tpl de base du module) et qui contient les infos que le clients à lui même remplis.

Mon "tpl pdf" je l'ai mis dans un sous dossier oui : monmodule/pdf/templatepdf.tpl

 

alors d'un coté j'ai un fichier Ajax qui traite les infos lorsque le client rempli le formulaire, en fait quand le client remplis le formulaire derrière l'ajax tourne et j'y fais notamment des calculs etc et je récupère les infos pour les afficher à la fin quand le client à fini de remplir le formulaire. 

A coté de ça, à la toute fin de la page j'ai un bouton submit "envoyer devis" qui envoi en POST les infos au controller qui lui les traite (effectivement en les récupérant avec Tools::getValue) dans une fonction PostProcess afin d'envoyer le dit devis par Mail::Send().

Donc je ne peux pas générer mon pdf dans le initContent (car je n'ai pas les infos client encore).

 

Je pense que tu as raison, il faut qu'une fois que le client submit le formulaire, je récupère les infos (Tools::getValue) dans le controller, je passe les variables au "tpl pdf" (ce que je cherche à faire) , je génére le pdf avec le "tpl pdf" bien rempli, j'attache au mail et bingo

Je vais essayer durant l'après mlidi,

Merci de ton aide en tout cas ! c'est sympa :)

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

D'accord, tu le fais de manière "classique" (:

Ah, si ton tpl est dans un sous-dossier, tu marques le chemin du sous-dossier 'pdf/montemplate.tpl' ça devrait être mieux pour que ton code le trouve ^^

Est-ce que ça marche, si tu include ton fichier ajax qui traite tes données dans ton php ? Je sais pas si ça se fait comme ça o: (c'est le seul truc auquel je pense, là... j'vois pas beaucoup d'autres solutions...)

Sinon je pense à remanier un peu le code, ce n'est que ma façon de voir, mais si tes calculs peuvent être fait hors ajax, récupérer donc toutes des données POST, faire les calculs directement et renvoyer les données en sortie dans le tpl. C'est une simple idée, hein, t'es pas obligé(e) d'y adhérer (:

Si tu ne peux pas faire sans ajax, une recherche google "passer des données d'ajax à php" devraient être plus fructueuses que mes connaissances succinctes d'ajax ^^'

Je pense qu'une fois que tu auras récupéré tes données d'ajax, tu y verras déjà un peu plus clair quant à ce que tu dois passer au tpl, avec initContent ou une autre méthode qui 'set' tes données dans le tpl.

 

[EDIT]

C'est peut-être plus simple de récupérer les infos qu'ajax te renvoie directement en php et initialiser  une variable ou deux pour les résultats donnés. Comme ça, même si la donnée du calcul ne change pas, tu pourras la transmettre plus simplement dans ton template pdf. Et ensuite chaque donnée récupérée, tu l'assignes à smarty et tu envoie chaque assignement dans ton tpl... (je ne sais pas si je m'exprime clairement, là ^^' )

 

[/EDIT]

 

De rien, c'est avec plaisir ! (: Bon développement, tiens-nous au courant de tes avancées !

 

Okar

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

Alors oui l'AJAX je m'en serait bien passé mais mon responsable ne m'a pas laissé vraiment le choix ^^ 

Cependant je viens juste de tester quelque chose et ça marche ! :) 

Alors en fait dans mon controller, fonction PostProcess j'ai une série de variables que je récupère du tpl grâce à la fonction Tools::getValue comme tu me disais, et en fait le truc c'est ce bout de code :

 

$this->context->smarty->setTemplateDir(_PS_MODULE_DIR_ . 'nomDuModule/pdf/template.tpl');
      $this->context->smarty->assign(array(       
        'variable' => $maVariable,
      ));

 
Il suffisait donc juste de redéfinir le chemin vers le "template PDF" en utilisant la fonction setTemplateDir 

Une fois ceci fait je peux générer mon pdf avec les bonnes données récupérées et l'attacher au mail :)

Je pense donc pouvoir dire que le sujet est résolu :) 

Merci de ton aide en tout cas ! Bonne journée (et bon'appétit oui quoique un peu tard maintenant ^^ ) 

Link to comment
Share on other sites

"$this->context->smarty->setTemplateDir(_PS_MODULE_DIR_ . 'nomDuModule/pdf/template.tpl');" Oui, repasser par la racine des modules, effectivement, c'est aussi une solution !

C'est génial si ça marche ! o/

Ce fut instructif pour moi aussi, tiens ^^

 

De rien, tu as trouvé aussi tout seul, mais ce fut avec plaisir de mon côté (:

 

(pour marquer un topic en résolu, tu édites ton premier post avec le full editor et tu marques devant ton titre '[RESOLU]' (:  )

 

Bonne journée !

 

Okar

  • Like 1
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...