egx Posted September 19, 2014 Share Posted September 19, 2014 (edited) 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 September 22, 2014 by egx (see edit history) Link to comment Share on other sites More sharing options...
Lactor Posted September 19, 2014 Share Posted September 19, 2014 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 More sharing options...
egx Posted September 22, 2014 Author Share Posted September 22, 2014 (edited) Je vais regarder ton lien, merci de ton aide ! SInon ça tombe bien pour la 1.5 car le site sur lequel je travaille est en 1.5 ^^ Pour Mail::Send() aucun soucis je l'ai déjà pas mal utilisé. Encore merci ! Cordialement, Edited September 22, 2014 by egx (see edit history) Link to comment Share on other sites More sharing options...
Ornicar Posted September 22, 2014 Share Posted September 22, 2014 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 More sharing options...
egx Posted September 22, 2014 Author Share Posted September 22, 2014 (edited) 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 September 22, 2014 by egx (see edit history) Link to comment Share on other sites More sharing options...
Lactor Posted September 22, 2014 Share Posted September 22, 2014 (edited) 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 September 22, 2014 by okar (see edit history) Link to comment Share on other sites More sharing options...
egx Posted September 22, 2014 Author Share Posted September 22, 2014 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::SendPour 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 More sharing options...
Lactor Posted September 22, 2014 Share Posted September 22, 2014 "[..]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 More sharing options...
egx Posted September 22, 2014 Author Share Posted September 22, 2014 (edited) 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 bingoJe vais essayer durant l'après mlidi,Merci de ton aide en tout cas ! c'est sympa Edited September 22, 2014 by egx (see edit history) Link to comment Share on other sites More sharing options...
Lactor Posted September 22, 2014 Share Posted September 22, 2014 (edited) 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 September 22, 2014 by okar (see edit history) Link to comment Share on other sites More sharing options...
egx Posted September 22, 2014 Author Share Posted September 22, 2014 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 More sharing options...
Lactor Posted September 22, 2014 Share Posted September 22, 2014 "$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 1 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