Jump to content

[résolu] Joindre automatiquement un fichier pdf lors de l'envoi du mail de commande


Recommended Posts

Bonjour,

Il semble que d'après mes recherches sur les forums, cette requête n'a jamais été évoquée.

Voilà, je voudrai joindre automatiquement un fichier pdf qui contient les CGV lors de l'envoi du mail de commande. Ainsi une fois sa commande finie, l'utilisateur recevra un mail récapitulatif accompagné du fichier pdf.

Pour cela je me suis penché sur 2 fichiers : classes/Mail.php et classes/PaymentModule.php

Voici les modifications que j'ai effectués :

Dans classes/PaymentModule.php, aux alentours de la ligne 360 :

J'ai changé ceci :

'{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency, false, false));

                   if (is_array($extraVars))
                       $data = array_merge($data, $extraVars);

                   // Join PDF invoice
                   if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number)
                   {
                       $fileAttachment['content'] = PDF::invoice($order, 'S');
                       $fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('d', $order->invoice_number).'.pdf';
                       $fileAttachment['mime'] = 'application/pdf';
                   }
                   else
                       $fileAttachment = NULL;

                   if ($orderStatus->send_email AND Validate::isEmail($customer->email))
                       Mail::Send(intval($order->id_lang), 'order_conf', 'Order confirmation', $data, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, $fileAttachment);
                   $this->currentOrder = intval($order->id);
                   return true;
               }



Par (ajout d'un bout code + modification de la fonction Mail::Send) :

'{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency, false, false));

                   if (is_array($extraVars))
                       $data = array_merge($data, $extraVars);

                   // Joindre les CGV en PDF --- ON
                   $PdfCGV['name'] = __PS_BASE_URI__ . 'CGV/CGV.pdf';
                   $PdfCGV['mime'] = 'application/pdf';
                   $PdfCGV['content'] = file_get_contents($PdfCGV['name']);
                   // Joindre les CGV en PDF --- OFF

                   // Join PDF invoice
                   if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number)
                   {
                       $fileAttachment['content'] = PDF::invoice($order, 'S');
                       $fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('d', $order->invoice_number).'.pdf';
                       $fileAttachment['mime'] = 'application/pdf';
                   }
                   else
                       $fileAttachment = NULL;

                   if ($orderStatus->send_email AND Validate::isEmail($customer->email))
                       Mail::Send(intval($order->id_lang), 'order_conf', 'Order confirmation', $data, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, $fileAttachment /* Joindre les CGV en PDF --- ON*/ , $PdfCGV /* Joindre les CGV en PDF --- OFF */);
                   $this->currentOrder = intval($order->id);
                   return true;
               }



Dans classes/Mail.php, aux alentours de la ligne 22 :

J'ai changé ceci :

    static public function Send($id_lang, $template, $subject, $templateVars, $to, $toName = NULL, $from = NULL, $fromName = NULL, $fileAttachment = NULL, $modeSMTP = NULL, $templatePath = _PS_MAIL_DIR_)



Par cela (ajout de la variable $PdfCGV) :

    static public function Send($id_lang, $template, $subject, $templateVars, $to, $toName = NULL, $from = NULL, $fromName = NULL, $fileAttachment = NULL, $modeSMTP = NULL, $templatePath = _PS_MAIL_DIR_, $PdfCGV)



J'ai du omettre quelque chose, car cela ne semble pas fonctionner : aucun fichier pdf n'est attaché au mail. Si quelqu'un a une idée ?

Merci bien.

Link to comment
Share on other sites

Voilà la solution testée avec succès chez moi :

Avertissement : J'ai donné le nom de $pdfCGV à ma variable mais vous pouvez l'appeler autrement.


1) Dans classes/Mail.php :


Modifier :

static public function Send($id_lang, $template, $subject, $templateVars, $to, $toName = NULL, $from = NULL, $fromName = NULL, $fileAttachment = NULL, $modeSMTP = NULL, $templatePath = _PS_MAIL_DIR_)



Par :

static public function Send($id_lang, $template, $subject, $templateVars, $to, $toName = NULL, $from = NULL, $fromName = NULL, $fileAttachment = NULL, $pdfCGV = NULL, $modeSMTP = NULL, $templatePath = _PS_MAIL_DIR_)



Modifier :

           global $_LANGMAIL;
           /* Create mail and attach differents parts */
           $message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME').'] '.((is_array($_LANGMAIL) AND key_exists($subject, $_LANGMAIL)) ? $_LANGMAIL[$subject] : $subject));
           $templateVars['{shop_logo}'] = (file_exists(_PS_IMG_DIR_.'logo.jpg')) ? $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.'logo.jpg'))) : '';
           $templateVars['{shop_name}'] = Configuration::get('PS_SHOP_NAME');
           $templateVars['{shop_url}'] = 'http://'.Tools::getHttpHost(false, true).__PS_BASE_URI__;
           $swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $templateVars)), 'decorator');
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 2)
               $message->attach(new Swift_Message_Part($templateTxt, 'text/plain', '8bit', 'utf-8'));
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 1)
               $message->attach(new Swift_Message_Part($templateHtml, 'text/html', '8bit', 'utf-8'));                
           if ($fileAttachment AND isset($fileAttachment['content']) AND isset($fileAttachment['name']) AND isset($fileAttachment['mime']))
               $message->attach(new Swift_Message_Attachment($fileAttachment['content'], $fileAttachment['name'], $fileAttachment['mime']));

           /* Send mail */
           $send = $swift->send($message, $to, new Swift_Address($from, $fromName));
           $swift->disconnect();
           return $send;



Par :

            global $_LANGMAIL;
           /* Create mail and attach differents parts */
           $message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME').'] '.((is_array($_LANGMAIL) AND key_exists($subject, $_LANGMAIL)) ? $_LANGMAIL[$subject] : $subject));
           $templateVars['{shop_logo}'] = (file_exists(_PS_IMG_DIR_.'logo.jpg')) ? $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.'logo.jpg'))) : '';
           $templateVars['{shop_name}'] = Configuration::get('PS_SHOP_NAME');
           $templateVars['{shop_url}'] = 'http://'.Tools::getHttpHost(false, true).__PS_BASE_URI__;
           $swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $templateVars)), 'decorator');
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 2)
               $message->attach(new Swift_Message_Part($templateTxt, 'text/plain', '8bit', 'utf-8'));
           if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 1)
               $message->attach(new Swift_Message_Part($templateHtml, 'text/html', '8bit', 'utf-8'));                
           if ($fileAttachment AND isset($fileAttachment['content']) AND isset($fileAttachment['name']) AND isset($fileAttachment['mime']))
               $message->attach(new Swift_Message_Attachment($fileAttachment['content'], $fileAttachment['name'], $fileAttachment['mime']));

           if ($pdfCGV AND isset($pdfCGV))
               $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/REPERTOIRE + NOM DU FICHIER PDF'), 'NOM DU FICHIER PDF.pdf'));

           /* Send mail */
           $send = $swift->send($message, $to, new Swift_Address($from, $fromName));
           $swift->disconnect();
           return $send;




2) Dans classes/PaymentModule.php :


Ajouter :

$pdfCGV = 1;



Sous (~ ligne 322) :

$invoice_state = $invoice->id_state ? new State(intval($invoice->id_state)) : false;



Et modifier :

Mail::Send(intval($order->id_lang), 'order_conf', 'Order confirmation', $data, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, $fileAttachment);



Par :

Mail::Send(intval($order->id_lang), 'order_conf', 'Order confirmation', $data, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, $fileAttachment, $pdfCGV);




Pour ceux qui utilisent le module Mail Alerts (Alertes email) :
3) Dans modules/mailalerts/mailalerts.php :


Modifier :

Mail::Send($id_lang, $template, $subject, $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, dirname(__FILE__).'/mails/');



Par :

Mail::Send($id_lang, $template, $subject, $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, NULL, dirname(__FILE__).'/mails/');

Link to comment
Share on other sites

  • 1 month later...

Bonjour,


Vu que je suis pas doué avec le code, j'aurais voulu savoir comment faire que pour la meme condition
if ($pdfCGV AND isset($pdfCGV))       


on puisse enlever juste le logo.jpg en attachement
et qu'il n'y est pas le nom de la boutique(et la description) dans l'objet du message.

Merci.



J'y suis arrivé.
Link to comment
Share on other sites

  • 3 months later...

Bonjour!

- ryudr: Super boulot!Merci à toi!
Je voudrais me servir de la même variable que toi. Ma question est peut être stupide mais je n'y connais rien en variable: dois je créer cette variable dans une table ou autre? Ou est-ce que je rédige textuellement ce que tu a mentionné ci-dessus? Merci par avance pour ta réponse :)

A défaut de ryudr, est-ce que quelqu'un pourrait m'aider svp?

Merci @ tous :lol:

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