2017-01-24 4 views
2

Je cours Wordpress et j'ai plusieurs utilisateurs. Chaque utilisateur doit recevoir un rapport hebdomadaire avec des informations uniques liées uniquement à cet utilisateur. Les informations doivent être collectées dans un fichier PDF (en utilisant mpdf pour générer des fichiers PDF) et envoyées à l'email de chaque utilisateur en conséquence.générer des fichiers PDF avec un contenu unique pour chaque utilisateur en boucle et envoyer chaque pdf à l'adresse e-mail de l'utilisateur correspondant - php

J'ai fichier report.php (je courrai sur ce travail cron fichier à envoyer rapport hebdomadaire) et voici mon code:

include('mpdf/mpdf.php'); 
$mpdf = new mPDF(); 

$args = array(
    'post_type' => 'users', 
    'post_status' => array('publish'), 
    'order' => 'DESC', 
    'posts_per_page'=> -1 
); 
$list = get_posts($args); 
if($list){ 
    foreach($list as $suppItem){ 
     $userID = $suppItem->ID; 
     ob_start(); 
     getUserReport($userID); /* this is the function which genarates html content 
     for each user because the content of course for each user is unique */ 

     $x = ob_get_contents(); 
     ob_end_clean(); 
     $mpdf->WriteHTML($x); 
     $today = date('Y-m-d'); 
     $pdfName = 'weekly-report-'.$userID.'-'.$today.'.pdf'; 
     $content = $mpdf->Output($pdfName, 'S'); 
     $content = chunk_split(base64_encode($content)); 
     $email = get_field('user_e_mail_address', $userID); 
     if($email) { 
      $mailto = $email; 
     } 
     $from_name = 'Website'; 
     $from_mail = '[email protected]'; 
     $replyto = '[email protected]'; 
     $uid = md5(uniqid(time())); 
     $subject = 'Weekly report of '.get_the_title($userID); 
     $message = 'Attached find this week report.'; 
     $filename = $pdfName; 

     $header = "From: ".$from_name." <".$from_mail.">\r\n"; 
     $header .= "Reply-To: ".$replyto."\r\n"; 
     $header .= "MIME-Version: 1.0"."\r\n"; 
     $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\""."\r\n"; 
     $finalmessage .= "--".$uid."\r\n"; 
     $finalmessage .= "Content-type:text/plain; charset=iso-8859-1"."\r\n"; 
     $finalmessage .= "Content-Transfer-Encoding: 7bit"."\r\n"; 
     $finalmessage .= $message."\r\n"; 
     $finalmessage .= "--".$uid."\r\n"; 
     $finalmessage .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n"; 
     $finalmessage .= "Content-Transfer-Encoding: base64\r\n"; 
     $finalmessage .= "Content-Disposition: attachment; filename=\"".$filename."\""."\r\n"; 
     $finalmessage .= $content."\r\n"; 
     $finalmessage .= "--".$uid."--"; 

     if (mail($mailto, $subject, $finalmessage, $header)) { 
      echo 'Sent!'; 
     } else { 
      echo 'error'; 
     } 
    } 
} 

Quand je suis en code ci-dessus, il envoie des e-mails à chaque utilisateur avec PDF joint mais le contenu est le même pour tous. Le nom de fichier PDF est ce qui est attendu mais le contenu est incorrect (sauf le premier élément dans une boucle). En fait, le corps de l'e-mail et le PDF du premier utilisateur sont corrects, mais le PDF de l'utilisateur de repos est le même contenu du premier utilisateur avec des pages vierges.

J'ai essayé de déplacer $content = $mpdf->Output($pdfName, 'S'); boucle extérieure foreach mais dans ce cas, il recueille le contenu de tous les utilisateurs ensemble et en même PDF envoie. Mais chaque utilisateur devrait recevoir son PDF correspondant.

Je me demande ce qui me manque à l'intérieur/à l'extérieur de la boucle afin qu'il envoie le fichier PDF correspondant à l'e-mail de l'utilisateur correspondant.

+0

écrire 'var_dump ($ x);' après 'ob_end_clean();' quel serait le résultat? – EniGma

+0

il renvoie le contenu de chaque utilisateur @EniGma – aidadev

+0

tout ce que je 'echo' ou' var_dump' dans cette page fonctionne parfaitement. Mais lors de l'envoi de pdf à chaque utilisateur séparément, cela ne fonctionne pas correctement. @EniGma – aidadev

Répondre

1

MISE À JOUR:

Enfin, il fonctionne. J'ai essayé de déplacer cette ligne ($mpdf = new mPDF()) dans la boucle de foreach et cela fonctionne! Ci-dessous vous pouvez voir comment mon code ressemble à l'intérieur de la boucle:

$mpdf = new mPDF(); 
ob_start(); 
getUserReport($userID); 
$html = ob_get_contents(); 
ob_end_clean(); 
$mpdf->WriteHTML($html); 

J'espère que cela aidera quelqu'un dans le futur!

0

À mon avis, ob_get_contents() récupérer seulement la première entrée à chaque fois. Pouvez-vous effacer ob_get_contents()? Ou vous pouvez essayer de renvoyer le code html sous forme de chaîne à partir du getUserReport(...) -Method.

EDIT

... 
$html = getUserReport(...); // get the report 
$mpdf->WriteHTML($html);  // write the report to pdf 
$html = "";     // clear the local variable 
... 
+0

J'ai essayé de retourner le html de la fonction 'getUserReport()' et il renvoie les informations de chaque utilisateur correctement @Patrick Vogt – aidadev

+0

C'est génial. Et si vous aviez mis le html dans la fonction 'WriteHTML (html)' ça ne marche pas? –

+0

cela fonctionne. Le problème est lors de l'envoi de courriels et comment je l'ai décrit dans mu question, il envoie un e-mail à chaque e-mail de l'utilisateur, mais le contenu PDF est le même @Patrick Vogt – aidadev