1

Bonjour,

je souhaite, au sein d'une boucle foreach, générer autant de pdf que de valeurs contenus dans un array() (Ici une variable de session $_SESSION['lisMed'] ) ... puis mailler chaque pdf à son destinataire avec la class PJMail
chaque boucle fait appel a une requête sql qui s'effectue bien et que je ne met pas ici car un peu longue et sans réelle importance.

En general , j'ai une boucle de 8-10 éléments à faire. Donc 8 à 10 pdf a generer et 8 -10 mails a faire partir a des destinataires différents. Les donnes sont tirés de la base de données.
Le hic est que seul le premier mail comporte un pdf correct ... et que les autres ont un pdf "vide".
Pourriez vous me dire où je fais une boulette dans mon script :

<?php
include ('parametrix.inc.php');

// # POUR GENERER LE PDF
  require_once(dirname(__FILE__).'/html2pdf/html2pdf.class.php');

// # POUR MAILER
   require_once(dirname(__FILE__).'/pjmail/pjmail.class.php'); 
   
ob_start();

foreach ($_SESSION['listMed'] as $c=>$idMed)
{
    $sql="SELECT ....
		ORDER BY dateDebut,M.nom, mois ASC";
		
	$rep=mysql_query($sql) or die(mysql_error());
	$row=mysql_num_rows($rep);	
	$pluriel=($row>1)? 's' : '';
	$msfr=mysql_fetch_row($rep);	# pour exploiter les données avant de faire la boucle.
?>
    <page style="font-size:12pt" backtop="7mm" backbottom="7mm" backleft="10mm" backright="10mm" footer="page;" style="font-size: 10pt">

	<br /><br />
	   Je soussigné, certifie avoir perçu en <?php echo $_SESSION['anRecap'];?><br />les honoraires  suivants de la part de  <?php echo $msfr[0];?> :<br /><br /><br />
		
		<table cellspacing="10" style="width: 100%; border: solid 1px black; background: #E7E7E7; font-size:12pt;">
          <tr>
            <th style="width:50%; text-align: center;">Période<?php echo $pluriel; ?></th>
            <th style="width:50%; text-align: right;">Rétrocession<?php echo $pluriel; ?></th>
          </tr>
        </table>
        <table cellspacing="10" style="width:100%; border:solid 1px black; font-size:12pt;">
<?php

        mysql_data_seek($rep,0);	# on repart au début du tableau car on avait fait un mysql_fetch_row plus haut
		while($donnees=mysql_fetch_assoc($rep))
		{ 
?>
			<tr>
			  <td style="width:50%; text-align: center;"><?php echo $donnees['date_debut_fr'];?> au <?php echo $donnees['date_fin_fr'];?></td>
			  <td style="width:50%;text-align: right;"><?php echo $donnees['retrocession'];?> €</td>
			</tr>
<?php	
		}
?>
		    ...... le reste de la page
   </page>   
<?php
  
  $content= ob_get_clean();

  $html2pdf = new HTML2PDF('P','A4','fr');
  $html2pdf->WriteHTML($content);  
  $content_PDF= $html2pdf->Output('mondoc'.$idMed.'.pdf',true);
    
  # POUR MAILER
    $mailText="Bonjour,<br /><br />Se trouve ci-joint, au format pdf, le justificatif comptable au cours de cette annee ".$_SESSION['anRecap'].".<br/><br />Pour ma part, je mentionnerai ce montant au titre des honoraires de l'exercice ".$_SESSION['anRecap'].".<br /><br />Bien confraternellement.<br />";
   $mail = new PJmail(); 
   $mail->setAllFrom('xxx@xxx.fr', "XXX");
   $mail->addrecipient('xxx@xxx.fr'); 
   $mail->addbcc('xxx@xxx.fr');
   $mail->addsubject("Justificatif comptable ".$_SESSION['anRecap']); 
   $mail->html = $mailText; 
   $mail->addbinattachement("recap_".$_SESSION['anRecap'].".pdf", $content_PDF); 
   $mail->sendmail(); 
  #echo $res;	
 } // end foreach

?>


je ne sais pas si c'est important : Avant de mettre en 'production' ... je m'envoi les mails à moi même . J'en recois autant que d'éléments dans le array() mais la PJ est pas OK pour tous sauf le premier.

Je vous remercie.

2

C'est peut-être parce que le script est incomplet, mais j'ai l'impression que le nom du PDF généré ('mondoc' . $idMed . '.pdf') ne correspond pas au nom de la pièce jointe attachée au mail ('recap_' . $_SESSION['anRecap'] . '.pdf'). Est-ce voulu ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

merci pour ta réponse.

je ne savais pas qu'il fallait mettre le même nom !
j'essai

edit : j'ai essayé ... cela est identique. pb pas réglé ;-(

4

À moins que je comprenne mal le fonctionnement du script, il faut mettre le même nom pour que ce soit le PDF qui vient d'être généré qui soit ajouté en pièce jointe par mail. Est-ce que les PDF sont correctement générés (ils devraient se trouver dans le même dossier que le script) ou non ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

en mettant l'option 'true' ou 'S':

$content_PDF= $html2pdf->Output('mondoc'.$idMed.'.pdf',true);

les pdf ne sont pas réellement écrits en dur sur le serveur ( j'ai compris cela depuis la doc )

6

Ah ok, au temps pour moi, du coup mes posts précédents étaient faux. Et justement, en changeant cette option pour que les PDF soient réellement écrits sur le disque, ça fonctionne ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

en mettant l'option 'F'

$content_PDF= $html2pdf->Output('mondoc'.$idMed.'.pdf','F');

j'ai x mails correspondants à x éléments de mon array() mais avec des PJ pdf de zero octet

8

Ce qui est logique, puisque qu'avec cette option (cette fois je viens d'aller lire la doc grin) les PDF devraient être écrits sur le serveur avec le nom spécifié. Est-ce qu'il y a donc bien x PDF sur le serveur dans le dossier qui contient le script ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

Oui il y a bien le bon nombre de doc pdf créés sur le serveur
Un seul est correct
les autres sont vierges !!

Pourtant je fais bien appel à chaque boucle aux fonctions suivantes :

$html2pdf = new HTML2PDF('P','A4','fr'); 
  $html2pdf->WriteHTML($content);   
  $content_PDF= $html2pdf->Output('mondoc'.$idMed.'.pdf','F');


je créé donc un nouvel un nouvel objet à chaque boucle !

J'ai tenté de mettre un sleep(5) pour laisser le temps necessaire de créer le pdf mais = idem.

10

OK, et dernière chose à vérifier : en supprimant les trois lignes d'appel à HTML2PDF (celles citées au post ./9) et en les remplaçant simplement par "echo $content", est-ce que le contenu des x documents souhaités s'affiche bien correctement dans le navigateur ?

Si oui, ça pourrait vouloir dire que la classe HTML2PDF conserve un état quelque part et ne peut pas être utilisée plusieurs fois d'affilée au sein d'un même script. Le cas échéant ça pourrait être un défaut de conception (pas forcément difficile à résoudre), mais il faudra attendre le passage de l'auteur pour avoir son avis.

Si non, il y a un bug dans le script du post ./1, et soit il n'apparaît pas dans cet extrait, soit je suis passé à côté.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

11

Je confirme qu'un echo $content est bien correct.

si spipu pouvait être par là

12

alors en effet ça ressemble à un bug ou une limitation de la lib, il ne reste plus qu'une solution smile

!call spipu
--- Call : spipu appelé(e) sur ce topic ...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13

heu, ben non, si avec un echo, le contenu est bon, c'est que c'est ensuite à l'envoie que ca bloque. non ?
Ancien pseudo : lolo

14

je n'ai pas de quoi tester mais si avec un echo ça s'affiche 10 fois mais qu'avec 10 instances d'HTML2PDF il n'y a que la première qui rend un résultat correct, ça me semble être plutôt côté HTML2PDF qu'il y a un souci smile

(cf. le post ./9, même en générant les PDFs sans les envoyer, ça produit quand même du blanc)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

15

Bonjour à tous le 2

je vous remercie pour vos intervention et après mûre réflexion... mur vient de comprendre le Hic !

htlm2pdf est innocent de même que pjmail.

si vous regardez mon script initialement présenté ... vous pouvez voir que l'appel à ob_start() est fait avant la boucle foreach !
c'est là mon erreur !
en le mettant dans le foreach ... j'ai bien autant de bon pdf généré qu'il n'y a de boucle.

désolé pour avoir lever la suspicion sur la bonne tenue de la class html2pdf

roll

16

ah oui en effet, j'ai accusé HTML2PDF à tort, bien vu smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

17

ah ben vi tiens smile j'avais même pas fait attention à ce point.

Ancien pseudo : lolo