Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PUBLIPOSTAGE (ZIP ET MEL)


Information sur la source

Description

Cliquez pour voir la capture en taille normale
Ce code permet la création d'un publipostage à partir d'un document .rtf (Microsoft ou OpenOffice) et de données extraite d'un fichier .csv et de paramétrer les documents en sortie
Etape 1 : Chargement des deux fichiers. Un aperçu sera afficher pour voir si le contenu est correct. En option la possibilité de protéger ces données par identifiant et mot de passe (utile si l'application est ouverte à plusieurs personnes ou en accès libre)
Etape 2 : Paramétrage avec une sélection des enregistrements a publier, la création du lien entre les données et les champs de fusion disponible, la définition du/des nom(s) du fichier à éditer (très utile pour créer 1 document par enregistrement et le nommer en fonction des ) ou encore le paramétrage de l'option d'envoi de mel
Etape 3 : La génération du/des documents qu'il sera possible de lire, d'envoyer par mel ou de récupérer dans un ZIP

Il y a en plus un bouton d'aide à chaque étape.
J'ai mis un jeu de test à votre disposition.
 

Source

  • <?php
  • error_reporting (E_ERROR|E_PARSE);
  • session_start();
  • ?>
  • <HTML>
  • <HEAD>
  • <TITLE>Publipostage Dam's Prod - Etape 1</TITLE>
  • <STYLE>
  • BODY {background:url('images/fond.png')}
  • A {cursor:pointer; text-decoration:none;}
  • button {font-size:16pt;}
  • </STYLE>
  • </HEAD>
  • <BODY>
  • <CENTER>
  • <TABLE border=0 width="100%"><TR><TD width="10%" style='vertical-align:middle; text-align:center; font-size:18pt;'>ETAPE<br>1/3<TD><CENTER><H1>CHARGEMENT DES FICHIERS</H1><TD width="10%"><A href='aide/1-.html' target=aide><IMG src='aide/images/aide.png' border="0" /></TABLE>
  • <?php
  • // Définition de la session
  • $ip=$_SERVER["REMOTE_ADDR"];
  • $i=1;
  • while (is_dir("_SESS_".$ip."_".$i))
  • $i++;
  • $_SESSION['session']="_SESS_".$ip."_".$i;
  • mkdir ($_SESSION['session'], 0777);
  • mkdir ($_SESSION['session']."/exports", 0777);
  • echo "<i>SESSION : <b>".$_SESSION['session']."</b></i><br><br>";
  • // Définition du séparateur
  • if (!$_SESSION['sep']) {
  • $_SESSION['sep']=";";
  • }
  • ?>
  • <TABLE border="0" width="100%">
  • <TR><TD width="20%" style="text-align:right;"><IMG src="images/OpenOffice writer 3D.png" />
  • <TD><CENTER><IFRAME src="chargement_rtf.php" width="80%" height="170" style="border:solid 1px #646D1D;"></IFRAME> <br><br>
  • <TD width="20%"><IMG id=img_rtf src="" />
  • <TR><TD width="20%" style="text-align:right;"><IMG src="images/openoffice tableur 3D.png" />
  • <TD><CENTER><IFRAME src="chargement_csv.php" width="80%" height="170" style="border:solid 1px #646D1D;"></IFRAME> <br><br>
  • <TD width="20%"><IMG id=img_csv src="" />
  • </TABLE>
  • <CENTER><FORM method="post" action="param.php">
  • Protection : Identifiant <INPUT type=text name=ident size=15 value=""> Mot de passe <INPUT type=text name=mdp size=15 value=""> (Laisser à vide si vous ne vous pas de protection)
  • <br><br><INPUT type=hidden id=fich_rtf name=fich_rtf size=50 value="rien">Séparateur dans fichier CSV &nbsp;<INPUT type=text name=sep value="<?php echo $_SESSION['sep'];?>" style="font-size:20pt;width:20px;">
  • <INPUT type=hidden id=fich_csv name=fich_csv size=50 value="rien"><br><br>
  • <INPUT id=suivant type=submit style="display:none;" value="Passer à l'étape suivante" />
  • </FORM>
  • <SCRIPT LANGUAGE="JavaScript">
  • var fich_rtf=document.getElementById("fich_rtf");
  • var fich_csv=document.getElementById("fich_csv");
  • var img_rtf=document.getElementById("img_rtf");
  • var img_csv=document.getElementById("img_csv");
  • var suivant=document.getElementById("suivant");
  • function suite() {
  • if ( (fich_rtf.value != "rien") && (fich_csv.value != "rien") ) {
  • suivant.style.display="block";
  • }
  • }
  • function maj_rtf(v) {
  • fich_rtf.value=v
  • if (v != "rien")
  • img_rtf.src="images/button_ok.png";
  • else
  • img_rtf.src="images/button_cancel.png";
  • suite();
  • }
  • function maj_csv(v) {
  • fich_csv.value=v
  • if (v != "rien")
  • img_csv.src="images/button_ok.png";
  • else
  • img_csv.src="images/button_cancel.png";
  • suite();
  • }
  • </SCRIPT>
  • </center>
  • </BODY>
  • </HTML>
<?php
  error_reporting (E_ERROR|E_PARSE);
  session_start();
?>
<HTML>
<HEAD>
<TITLE>Publipostage Dam's Prod - Etape 1</TITLE>
<STYLE>
	BODY {background:url('images/fond.png')}
	A {cursor:pointer; text-decoration:none;}
	button {font-size:16pt;}
</STYLE>
</HEAD>
<BODY>
<CENTER>
<TABLE border=0 width="100%"><TR><TD width="10%" style='vertical-align:middle; text-align:center; font-size:18pt;'>ETAPE<br>1/3<TD><CENTER><H1>CHARGEMENT DES FICHIERS</H1><TD width="10%"><A href='aide/1-.html' target=aide><IMG src='aide/images/aide.png' border="0" /></TABLE>


<?php

// Définition de la session
$ip=$_SERVER["REMOTE_ADDR"];
$i=1;
while (is_dir("_SESS_".$ip."_".$i))
	$i++;
$_SESSION['session']="_SESS_".$ip."_".$i;
mkdir ($_SESSION['session'], 0777);
mkdir ($_SESSION['session']."/exports", 0777);

echo "<i>SESSION : <b>".$_SESSION['session']."</b></i><br><br>";

// Définition du séparateur
if (!$_SESSION['sep']) {
	$_SESSION['sep']=";";
}

?>

<TABLE border="0" width="100%">
<TR><TD width="20%" style="text-align:right;"><IMG src="images/OpenOffice writer 3D.png" />
<TD><CENTER><IFRAME src="chargement_rtf.php" width="80%" height="170" style="border:solid 1px #646D1D;"></IFRAME> <br><br>
<TD width="20%"><IMG id=img_rtf src="" />

<TR><TD width="20%" style="text-align:right;"><IMG src="images/openoffice tableur 3D.png" />
<TD><CENTER><IFRAME src="chargement_csv.php" width="80%" height="170" style="border:solid 1px #646D1D;"></IFRAME> <br><br>
<TD width="20%"><IMG id=img_csv src="" />
</TABLE>
<CENTER><FORM method="post" action="param.php">
Protection : Identifiant <INPUT type=text name=ident size=15 value=""> Mot de passe <INPUT type=text name=mdp size=15 value=""> (Laisser à vide si vous ne vous pas de protection)
<br><br><INPUT type=hidden id=fich_rtf name=fich_rtf size=50 value="rien">Séparateur dans fichier CSV &nbsp;<INPUT type=text name=sep value="<?php echo $_SESSION['sep'];?>" style="font-size:20pt;width:20px;">
<INPUT type=hidden id=fich_csv name=fich_csv size=50 value="rien"><br><br>
<INPUT id=suivant type=submit style="display:none;" value="Passer à l'étape suivante" />
</FORM>
<SCRIPT LANGUAGE="JavaScript"> 

var fich_rtf=document.getElementById("fich_rtf");
var fich_csv=document.getElementById("fich_csv");
var img_rtf=document.getElementById("img_rtf");
var img_csv=document.getElementById("img_csv");
var suivant=document.getElementById("suivant");
		
	function suite() {
		if ( (fich_rtf.value != "rien") && (fich_csv.value != "rien") ) {
			suivant.style.display="block";
		}
	}

	function maj_rtf(v) {
		fich_rtf.value=v
		if (v != "rien")
			img_rtf.src="images/button_ok.png";
		else
			img_rtf.src="images/button_cancel.png";
		suite();
	}

	
	function maj_csv(v) {
		fich_csv.value=v
		if (v != "rien")
			img_csv.src="images/button_ok.png";
		else
			img_csv.src="images/button_cancel.png";
		suite();
	}
</SCRIPT>
</center>
</BODY>
</HTML>

Conclusion

J'attends vos remarques
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de webdeb le 11/05/2008 19:24:06

Je ne jugerai pas la qualité du code HTML qui assez mauvaise. Concernant PHP :

1/ En production on n'affiche pas les erreurs. Tu peux laisser un error_reporting à E_ALL mais il faut que le serveur n'affiche pas les erreurs (display_errors à Off) et les loggues (log_errors à On).

2/ Pourquoi ne fais-tu pas tes traitements PHP avant le code HTML ?

signaler à un administrateur
Commentaire de ddempt le 12/05/2008 06:52:01

2/ Pourquoi ne fais-tu pas tes traitements PHP avant le code HTML ?

Je ne comprends pas ce que tu veux dire.

signaler à un administrateur
Commentaire de masternico le 13/05/2008 01:20:17

Salut,
il veut juste dire qu'il est plus judicieux de commencer par mettre le code php en début de script avant de commencer à afficher du HTML.
A moins, évidemment d'utiliser la buffurisation de sortie ob_start() (très pratique d'ailleur) puis de récupérer le contenu du buffer en fin de page et d'envoyer le contenu au navigateur.
Il a aussi voulu dire que la gestion du temps d'execution maximal de script se gère dans le fichier php.ini. Il en va de même pour la gestion de ce que php doit afficher comme erreur à l'écran.
En dévellopement, c'est bien pratique de faire afficher les erreurs, mais dès que ton script est en production, il faut impérativement désactiver l'affichage des erreurs. Les erreurs doivent êtres 'logguée' dans un fichier que tu pourras consulter quand tu veux. Gros avantage, tu récupères les messages d'erreurs de TOUT le monde. Super gain de temps pour le debuggage et surtout, super gain en sécurité car les messages d'erreurs sont des mines d'information pour les petits malins et un tels script exposé aux menaces d'Internet ne résiste pas longtemps. Alors, évidemment, il semblerais que ton script ne soit destiné qu'à un usage local ou intranet mais bon, quand même.

j'ai lu en diagonale mais j'ai vu des prb d'analyse de scipt (je ne critique pas le fonctionnement, mais la syntaxe). Les includes de class se font en début de script (cf remarque précédente). Tu mélanges alègrement php et HTML.


/*************************************
****************************************/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<?php
  error_reporting (E_ERROR|E_PARSE);     //à supprimer et à gérer dans php.ini

  session_start();                       //ne fonctionne pas puisque tu as déjà envoyé du code html

set_time_limit(3600);                    //à supprimer et à gérer dans php.ini

$mon_mel="";

//temps d'execution
function getMicroTime() {
$microsecondes=microtime();
list($micro,$time)=explode(' ',$microsecondes);
return($micro+$time);
}
$time_start = getmicrotime();   //??? tu mélange les nom de proc??? en déclaration on a getMicroTime et maintenant getmicrotime en minuscule??? j'ai pas testé, mais il marche ton code?

/* Insert de la class qui envoie la pièce jointe */
require "CMailFile.php";   // à mettre en début de page

echo "<BODY onload='cacher()'>";   // passez moi les mouchoirs, je pleure



$fileLines=file("../".$_SESSION['session']."/exports/mels.txt");
echo count($fileLines)." mels à envoyer";

$fic=fopen("../".$_SESSION['session']."/exports/mels.txt","r");

for ($ligne = fgetcsv($fic, 1024, ";"); !feof($fic); $ligne = fgetcsv($fic, 1024, ";")) {
echo "<br>".$ligne[0];
if (filter_var($ligne[0], FILTER_VALIDATE_EMAIL)) {   // !!! >= PHP5 uniquement
//************************************************************//
// heuuu... tu instancie un nouvel objet pour chaque mail??? t'as déja fait tourné ton programme avec une base de plusieurs miliers de mails??? je vois le plantage mémoire à l'horizon... l'objet doit être instancié une fois puis réutilisé pour tous les mails. Ou bien il faut détruire l'objet avant d'en créer un nouveau. Sinon, l'utilisation de ta mémoire gonfle, gonfle, puis tout explose...
//************************************************************//
$newmail = new CMailFile($ligne[2],$ligne[0],$mon_mel,$ligne[3]."\n\nCi-joint un fax. Enregistrez sur votre ordinateur pour le lire, merci.","../".$ligne[4],"base 64");
$newmail->sendfile();
echo " <b style='color:green;'>Envoyé</b>";
} else {
echo " <b style='color:red;'>Pas un mel</b>";
}

}

fclose($m);

echo "<br><center><A onclick=\"parent.cacher_fenetre();\"><button>FERMER</button></A>";

// Affichage du temps
$time_end = getmicrotime();
$time = round($time_end - $time_start,4);
echo "<br><span class=cache style='font-size:8pt;'>Exécution en $time secondes</span>";
?>

<SCRIPT language=JavaScript>
<!--
var res=document.getElementById("res");

function cacher() {
alert("Envoi effectué");
}

//-->
</SCRIPT>
/********************************
***********************************/
/*???????????????????????????????????????
et la balise de fin de corps et de fin de html??? ton script ne passe certainement pas la validation du W3C
*/

signaler à un administrateur
Commentaire de ddempt le 13/05/2008 23:03:34

Bonjour,

Merci pour tout ton commentaire masternico.

Je suis contient que mon code n'est pas très aux "normes", MAIS ça marche et c'est ce que je cherchais jusqu'à aujourd'hui on peut, et je ne suis pas contre quelques trucs et conseils pour améliorer mon code et pourquoi pas améliorer la rapidité.
Pour cela, je n'ai jamais mis de DOCTYPE car je ne voyais pas pourquoi il fallait le mettre, une idée ?

Sinon pour ce que tu me conseil de mettre dans le php.ini cela ne poserait pas un problème pour ceux qui prendrait mon code et ne l'aurait pas gérer dans leur php.ini ?

"""echo "<BODY onload='cacher()'>";   // passez moi les mouchoirs, je pleure""" c'est parce que je ne l'ai pas mis dans le code HTML directement ? ou alors il y a mieux ?

En effet j'ai fais des testes et la mémoire "gonfle" un peut je vais suivre ton conseil. Bien sur si après tu as de 128K en connexion c'est encore + long pour l'envoi, je vais peut être voir pour une version qui n'enverrais qu'un lien vers le document.

Enfin, non ça ne passe pas trop le W3C, mais comme je te le disais mon code fonctionne, là tu testé ?

signaler à un administrateur
Commentaire de masternico le 14/05/2008 07:45:58

Salut,
Alors pour faire cour, l'importance des entêtes HTML est crutiale par rapport au comportement que va avoir le navigateur. Si tu utilise le HTML4 (c'est ton cas), il faut savoir que tout les navigateurs ne le supporte pas forcément pleinement. En fait, celà joue surtout sur l'interprétation des balises. En HTML1, tu ne pouvais pas faire les mêmes choses qu'en HTML2 ou 3.
Perso, je te conseillerais d'aller visiter le site du W3C et récupérer un entête type que eux recommendent. Comme ça tu sera sûr de pas te planter.
"c'est parce que je ne l'ai pas mis dans le code HTML directement ? ou alors il y a mieux ?" ((oui et non) et oui). Il faut absolument que tu prennes l'habitude de séparer les languages. Encore une fois, je ne critique pas le fonctionnement du programme mais bien la syntaxe et la grammaire. Alors je pleure parceque le code 'echo "<BODY..."' est posé là comme un sac de vieux linges sales.
Je t'ai suggéré d'utiliser la buffurisation de sortie ob_start(). En fait, c'est supper pratique et celà résoudrai quelques petits soucis grammaticale. Cettebinstruction ordonne à php de stocker le résultat HTML de la page dans un buffer (attention au stack overflow) le temps de finir de construire la page, puis quand tout est près, on vide le buffer que l'on envoi au navigateur. Donc du coup tu peut te permettre de faire du traitement au sein de ton code HTML, mais encore une fois ce n'est pas propre et celà ressemble plus à de la bidouille qu'à de la programmation.
Voila comment j'écrirais ton code:

/*************************************
****************************************/
<?php
session_start();                       //toujours à mettre en début de script
/* Insert de la class qui envoie la pièce jointe */
require_once 'CMailFile.php';   // _once pour être plus propre et éviter des doubles inclusions dans l'avenir

$mon_mel='';
$buffer = '';
//temps d'execution
function getMicroTime() {        // essayes de garder une indentation propre et constante
  $microsecondes = microtime();
  list($micro,$time) = explode(' ',$microsecondes);
  return($micro+$time);
}
$time_start = getMicroTime();  

$fileLines = file("../".$_SESSION['session']."/exports/mels.txt");
$buffer .= count($fileLines) . " mels à envoyer";

$fic=fopen("../".$_SESSION['session']."/exports/mels.txt","r");  //fileLines contient déjà ton fichier

for ($ligne = fgetcsv($fic, 1024, ";"); !feof($fic); $ligne = fgetcsv($fic, 1024, ";")) {
  $buffer .= "<br>" . $ligne[0];
  if (filter_var($ligne[0], FILTER_VALIDATE_EMAIL)) {   // !!! >= PHP5 uniquement
    $newmail = new CMailFile($ligne[2],$ligne[0],$mon_mel,$ligne[3]."\n\nCi-joint un fax. Enregistrez sur votre ordinateur pour le lire, merci.","../".$ligne[4],"base 64");
    $newmail->sendfile();
    $buffer .= " <b style='color:green;'>Envoyé</b>";
  } else {
    $buffer .= " <b style='color:red;'>Pas un mel</b>";
  }

}

fclose($m);

$buffer .= "<br><center><A onclick=\"parent.cacher_fenetre();\"><button>FERMER</button></A>";

// Affichage du temps
$time_end = getMicroTime();
$time = round($time_end - $time_start,4);
$buffer .= "<br><span class=cache style='font-size:8pt;'>Exécution en $time secondes</span>";
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<SCRIPT type='text/javascript'>
//<![CDATA[    
var res=document.getElementById("res");

function cacher() {
  alert("Envoi effectué");
}

//]]>
</SCRIPT>
</HEAD>
<BODY onload='cacher()'>
<?php
  echo $buffer;
?>
</BODY>
</HTML>
/********************************
**********************************/

Voilà, ce n'est pas parfait, mais c'est beaucoup plus propre comme ça. Force toi à respecter les indentation pour visualiser tout de suite où sont les débuts et fins de crochets

Renseigne toi bien sur ce que fait une instruction avant de l'utiliser. (cf www.php.net)

Enfin, pour avoir des exemples je te conseil de regarder les codes de certaines bêtes du php (coucou47, malalam... j'en passe , mais la liste est plutot longue, commence par regarder les codes de ceux là et tu suis le fils des conversation pour trouver les autres) qui rodent dans le coin. Tu verra que tout est structuré. Comme ça, c'est plus facile à maintenir.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

AU SECOURS !!! ZIP ZIP [ par omnikod ] Voilà mon pb :je voudrais que le script php lise à un certain moment (kan la base dépasse une certaine taille par exemple) les enregistrement d'une t réaliser et envoyer des fichiers zip [ par pupuce ] J'ai vu qu'il est possible de créer des fichiers zip, jusque là je vois bien comment faire mais :Je veut pouvoir envoyer le zip au client, sans qu'il Upload!!! [ par yoman64 ] A l'aide Pour upload!!!Quand quelqun veut uploader un zip sa dit:Warning: Unable to open 'C:\WINDOWS\Desktop\test.rar' for reading: No such file or di créé 1 zip avec un file [ par Stephane ] salubeh voila je voudrai savoir si c possible et si oui comment, créé un zip avec 1 fichier dedan (je n'ai besoin que d'y mettre 1 fichier)merci bcp ! Fichiers CSV+Tableaux et Balaises en PHP !!! [ par spectroman ] Avis à ceux qui maitrise PHP !!!- Demande I :Les fichiers :* Un fichier genre "données1.php"Qui s'occupe de générer l'affichage d'un page de type HTML Rajouter un zip à un code source [ par LordDaedalus ] Une question toute bête Comment on joint un zip à une source ?MerciLord Daedalus upload fichier ZIP [ par kalib ] bonjourje ne trouve pas comment faire pour uploder un fichier zip sur mon FTP depuis un interface PHP.Et permettre la decompression de ce fichier sur Zip [ par Microbsoft ] Salut, est-ce que quelqu'un pourrait me dire précisement et me donner la source pour pouvoir compresser plusieurs fichiers en même temps ? Merci à cel excusez moi je me suis planté de fichier zip [ par delbator ] j'ai mis un petit prog de 4ko dans le fichier zip joind a ma source ki ne correspond pas a l'annonce je ne sais pas komment effacer cette source envoy zip [ par ultranono ] Salut,je suis débutant en php, je voudrai savoir s'il est possible de zipper des fichiers, et si oui comment ?merci


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode