Perso Web Management Prog Blogosphère Développement Etudes OS Sécurité Infographie Mobiles Référencement Divers

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

Ayant eu à mettre en place ce type d'installation sur un de mes projets et m'étant heurté à quelques difficultés, j'ai décidé de vous en faire part avec d'espérer résoudre vos problèmes et ainsi optimiser votre temps de travail ;)

Tout d'abord le contexte. Le contexte dans lequel je me trouve est assez précis, aussi il conviendra à certains d'entre vous, mais pas à d'autres (cela dit, les "autres" ne devraient pas avoir de problème avec leur installation en se référant aux tutos de base disponibles sur la toile).

Je vais vous montrer comment mettre en place un brige entre Joomla 1.5 (paramétré en slave) et PHPBB 3 (paramétré en master et accessible via un sous-domaine) grâce au composant JFusion. Dans le meilleur des cas, le dual login avec cette configuration fonctionne dans un sens (Joomla > PHPBB) mais pas dans l'autre. Ou alors cela fonctionne sur IE mais pas sur FF ou Chrome. Bref, grâce à ce tuto, tous ces petits soucis devraient disparaître.

Pour ceux qui ont déjà leur composant JFusion installé et correctement paramétré et que, malgré ça, leur bridge ne fonctionne pas, je vous renvoi à l'étape 8. Elle devrait répondre à vos questions.

Pour les autres. J'estime que vous avez un certain niveau concernant la mise en place d'applications web, aussi je pars du principe que Joomla 1.5 et PHPBB 3 sont déjà installés sur votre serveur.

Il vous faut vous munir du composant JFusion en allant le télécharger à cette adresse (version 1.2.3 à l'instant où j'écris ce tuto). Une fois le package récupéré, rendez-vous dans votre back-office Joomla, dans la rubrique Extensions > Installer / Désinstaller et uploadez votre package afin d'installer le composant.

1. Configuration du plugin Joomla

Rendez-vous dans le menu Composants > JFusion > Joomla Options et renseignez-y les infos suivantes :

Plugin General Details

  • Description : Le nom que vous souhaitez donner au plugin (aucune importance)
  • URL complet vers le logiciel intégré : L'URL de votre application Joomla (ex : http://macroshot.fr)

Login Option

  • Identificateur de connexion : Identifiant
  • Filtre de l'identifiant : joomla_int

Puis sauvegardez. Une fois la configuration enregistrée, il vous faut revenir dans le menu d'édition du plugin afin de renseigner les options utilisateurs, en particulier le groupe attribué automatiquement lors de l'enregistrement. Renseignez-donc les infos suivantes :

User Options

  • Groupe d'utilisateur mode : Simple
  • Groupe d'utilisateur par défaut : REGISTERED

Puis sauvegarder à nouveau.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

2. Configuration du plugin PHPBB

Ensuite, il va vous falloir configurer le plugin PHPPBB 3. Si vous ne y êtes pas déjà, retournez dans le CPanel de JFusion et rendez-vous dans la catégorie Configurer les Plugins, et éditez le plugin PHPBB 3. Renseignez-y les infos suivantes :

Plugin General Details

  • Description : Le nom que vous souhaitez donner au plugin (aucune importance)
  • URL complet vers le logiciel lntégré : L'URL de votre application PHPBB 3 (ex : http://macroshot.fr/forum). Attention ! Si votre forum est sur un sous-domaine, vous devez renseigner l'URL du domaine principal (Donc ne surtout pas metttre : http://forum.macroshot.fr)
  • Chemin complet vers le logiciel lntégré : Le chemin absolu de votre application PHPBB 3 (ex : /home/macroshot/www/forum)

Maintenant les choses se corsent un peu. Aussi, relisez bien ce tuto afin d'être sûr de ne faire aucune erreur. Les informations qui suivent concernent les cookies. Vous devez vous assurer que ces informations coïncident avec celles de votre forum PHPBB3. Aussi, rendez-vous dans le back-office de votre forum afin de récupérer ces informations. Elles se situent dans Général > Configuration du serveur > Paramètres de cookie. Il ne vous reste plus qu'à copier ces informations dans votre interface JFusion. Pour ma part, les voici :

  • Domaine du Cookie : .macroshot.fr
  • Chemin du Cookie : /
  • Préfixe du Cookie : phpbb3_32kjg
  • Durée de Session (min) : 60
  • Autorisez la Connexion Automatique par Cookie : Activé

Concernant la durée de session, celle-ci est définie, sur PHPBB 3, dans la rubrique Général > Configuration du serveur > Paramètres de charge. Par défaut elle est de 3600 secondes, d'où les 60 minutes déclarées précédemment.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

Database Options

Renseignez-y tout simplement les informations de connexion à votre base de données PHPBB 3.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

Login Options

  • Identificateur de connexion : Identifiant
  • PHPBB_LOGIN_TYPE : PHPBB_LOGIN_DIRECT

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

Puis sauvegardez. Une fois la configuration enregistrée, il vous faut revenir dans le menu d'édition du plugin afin de renseigner les options utilisateurs, en particulier le groupe attribué automatiquement lors de l'enregistrement. Renseignez-donc les infos suivantes :

User Options

  • Groupe d'utilisateur mode : Simple
  • Groupe d'utilisateur par défaut : REGISTERED

Théoriquement, toutes les autres options n'ont pas à être changées, si ce n'est le show_auth_mod, dans la rubrique Mod/Plugin Options qui doit être activé.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

3. Configuration générale

Une fois chaque plugin configuré, il va vous falloir renseigner à JFusion les comportements que doivent adopter chacun des plugins. Aussi, rendez-vous dans la page général de configuration des plugins et paramétrez les comme ceci :

Plugin Joomla

  • Maître : Non
  • Esclave : Oui
  • Cryptage Vérifié : Oui
  • Dual Login : Oui

Plugin PHPBB

  • Maître : Oui
  • Esclave : Non
  • Cryptage Vérifié : Oui
  • Dual Login : Oui

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

4. Paramétrage de vos applications

Votre application Joomla étant paramétrée en esclave, il vous faut désactiver le système d'enregistrement des utilisateurs. Aussi, rendez-vous dans l'onglet Site > Configuration générale > Système et cochez le radio bouton Non en face de Autoriser l'enregistrement des utilisateurs.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

De plus, afin de permettre une synchronisation optimale des sessions, vous devez régler la durée des sessions. Cette option se trouve dans la même page que la précédente (Site > Configuration générale > Système). Changez la valeur actuelle par 60 minutes, ou par la valeur personnalisée que vous avez déclaré dans l'administration de votre forum PHPBB et dans votre plugin PHPBB dans l'interface JFusion.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

Concernant votre application PHPBB, il vous faut vous rendre dans son interface d'administration afin de paramétrer la méthode d'authentification qui va vous permettre de vous logguer automatiquement sur Joomla via un login depuis votre forum. Pour se faire, rendez-vous dans la rubrique Général > Communication > Authentification et sélectionnez JFusion comme méthode d'authentification avant d'enregistrer.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

5. Synchronisation des utilisateurs

Une fois le tout configuré, il va vous falloir synchroniser les utilisateurs de votre MASTER avec ceux de votre SLAVE. Pour ceci, utilisez la fonction Nouveau User Sync de JFusion accessible depuis le Cpanel. Il vous faut inclure le plugin joomla_int afin de procéder à la synchronisation en cliquant sur démarrer. Un compte à rebours vous indique que la synchronisation est en cours.

Mettre en place un bridge entre Joomla 1.5 et PHPBB 3 avec JFusion

6. Login checker

Le login checker va vous permettre de vérifier le bon fonctionnement de votre bridge. Il est accessible depuis le Cpanel de JFusion. Renseignez-y le login et le mot de passe de votre compte et vérifiez la connexion en cliquant sur la flèche verte prévue à cet effet. Si vous avez bien suivi toutes les manipulations ci-dessus, cette étape devrait bien se dérouler.

7. Test du bridge

Nous allons maintenant procéder au test du bridge en grandeur nature. Pour ceci, rendez-vous dans le Cpanel de JFusion et cliquez sur le lien Activer les Plugins JFusion en haut à droite de l'écran. Une fois le tout confirmé, videz les cookies de votre navigateur. Procédez maintenant en 2 étapes :

  • Connectez-vous sur votre interface Joomla. Rendez-vous sur votre forum et regardez si vous êtes loggué. Si c'est le cas, retournez sur votre interface Joomla et déconnectez-vous. Rendez-vous sur votre forum afin de voir si vous êtes bien déconnecté
  • Ensuite, faites la même démarche en vous connectant et en vous déconnectant depuis le forum.

Si tout fonctionne bien, bravo ! Vous pouvez profiter de votre nouveau bridge. Dans le cas contraire, 8ème étape :

8. Modification des codes source

En principe, vous lisez ceci parce-que vous avez installé votre forum sur un sous-domaine et que le login sur votre forum ne vous connecte pas sur votre application Joomla.

Pour ceux qui ont directement commencé par cette partie (autrement dit, qui avaient déjà installé et paramétré JFusion lors de leur arrivée sur mon site) et qui utilisent un sous-domaine pour accéder à leur forum, veuillez tout d'abord vous rendre dans l'interface de configuration du plugin PHPBB 3 de JFusion. Dans le paramètre URL Complet vers le Logiciel Intégré, assurez-vous que l'URL renseignée est l'URL du domaine principal et non du sous-domaine (ex : renseigner http://macroshot.fr/forum au lieu de forum.macroshot.fr).

Maintenant, il va vous falloir mettre les mains dans le cambouis. Tout d'abord au niveau des sessions :

  • Ouvrez le fichier votresite/libraries/joomla/session/session.php
  • Recherchez les 2 occurrences de session_start()
  • Insérez le code suivant sur une nouvelle ligne juste avant chacune des occurrences :
ini_set('session.cookie_domain','.votredomaine.fr');

Ensuite au niveau des cookies :

  • Ouvrez les fichiers suivants : votresite/libraries/joomla/application/application.php, votresite/libraries/joomla/session/session.php, votresite/plugins/system/remember.php
  • Recherchez toutes les occurrences de la fonction setcookie()
  • À chaque occurrence, rajoutez un paramètre à la fonction représentant votre nom de domaine principal

Exemple :

setcookie( JUtility::getHash('JLOGIN_REMEMBER'), false, time() - 86400, '/');

Devient :

setcookie( JUtility::getHash('JLOGIN_REMEMBER'), false, time() - 86400, '/', '.votredomaine.fr');

Et voilà, le tuto est terminé ! Si vous avez des questions, suggestions à propos de ce tuto, réagissez à la suite de l'article. Ça permettra d'aiguiller les internautes en quête d'informations !

29 oct. 2009

PHPBB Gallery, calculer la moyenne des notes obtenues

Icone Heure 11:12 Icone Auteur Jean-Christophe Duvivier

Mots Clés Dotclear, Forum, PHP, PHPBB, Plugins,

Logo PHPBBÉtant en train de mettre en place un forum PHPBB, je me suis rapidement confronté aux problèmes d'ajout de modules qui, sur PHPBB, sont loin d'être automatisés. Ayant pris l'habitude des installations de plugins sous Dotclear, ça change... Bref. Il m'était nécessaire d'installer un module de gestion de galerie et je me suis tourné vers PHPBB Gallery qui connaît une certaine popularité. Après 60 minutes de procédure d'installation et après avoir découvert les fonctionnalités de cet excellent module, je me suis heurté à quelques difficultés. En effet, ce module étant doté d'un système de notation, je voulais afficher la note moyenne de chaque membre pour toutes les photos qu'il a mis en ligne, afin que chacun sache où se situer en terme de "performance". Malheureusement, cette fonctionnalité n'est pas disponible de base, dans la version 1.0.3. Je l'ai donc développée.

PHPBB Gallery - Moyenne des notes

Voici la procédure :

1. Le traitement

a - Tout d'abord nous allons nous occuper du traitement, c'est à dire le calcul de la moyenne de chaque membre. Pour ceci, rendez-vous à la racine de votre forum et ouvrez le fichier viewtopic.php avec votre éditeur PHP préféré. Cherchez-y le bout de code suivant :

$user_cache[$poster_id] = array(
'joined'		    => '',
'posts'		    => '',

Et remplacez-le par celui-ci :

$user_cache[$poster_id] = array(
'joined'		    => '',
'posts'		    => '',
'rates_average' => '',

On ajoute tout simplement un élément dans le tableau user afin d'y renseigner la moyenne des notes. Ici, on est dans le cas où l'utilisateur qui poste n'a pas de compte, on ne lui attribue donc pas de valeur.

b - Ensuite, recherchez ce code :

$user_sig = '';
// We add the signature to every posters entry because enable_sig is post dependant
if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
{
	$user_sig = $row['user_sig'];
}

Et placez-y juste avant (donc au début du else) le code suivant :

// Moyenne des notes
$sql_rates_average = 'SELECT ROUND(AVG(m),1) AS rates_average, rate_image_id FROM 
(SELECT rate_image_id, AVG(rate_point) as m FROM '.GALLERY_RATES_TABLE.' GROUP BY rate_image_id) AS td WHERE 
rate_image_id IN (SELECT image_id FROM '.GALLERY_IMAGES_TABLE.' WHERE image_user_id = '.$poster_id.')';
$result_rates_average = $db->sql_query($sql_rates_average);
$row_rates_average = $db->sql_fetchrow($result_rates_average);
$user_rates_average = $row_rates_average['rates_average'];
$db->sql_freeresult($result_rates_average);

C'est tout simplement la requête SQL qui va récupérer les notes de toutes les photos de chaque utilisateur et va en faire la moyenne. À noter que la moyenne est calculée en fonction des moyennes de chaque photo et non pas en fonction de toutes les notes reçues par l'utilisateur.

c - Ensuite, recherchez ce code :

$user_cache[$poster_id] = array(
'joined'		=> $user->format_date($row['user_regdate']),
'posts'		=> $row['user_posts'],

Et remplacez-le par celui-ci :

$user_cache[$poster_id] = array(
'joined'			=> $user->format_date($row['user_regdate']),
'posts'			=> $row['user_posts'],
'rates_average' 	=> $user_rates_average,

Comme dans l'étape a, cette étape consiste à rajouter un élément dans le tableau de l'utilisateur afin de lui attribuer sa moyenne de notes. Il s'agit ici des utilisateurs enregistrés, on peut donc leur attribuer une valeur.

d - Enfin, recherchez ce code :

'POSTER_JOINED'		=> $user_cache[$poster_id]['joined'],
'POSTER_POSTS'		=> $user_cache[$poster_id]['posts'],

Et remplacez-le par le code suivant :

'POSTER_JOINED'		=> $user_cache[$poster_id]['joined'],
'POSTER_POSTS'		=> $user_cache[$poster_id]['posts'],
'POSTER_RATES_AVERAGE'	=> $user_cache[$poster_id]['rates_average'],

Ici, on attribue simplement une référence texte à la valeur de la moyenne des notes, afin de l'afficher dans le squelette (c'est une gestion de template ordinaire).

Maintenant que la moyenne de chaque membre est calculée, il reste à l'afficher au bon endroit.

2. L'affichage

e - Tout d'abord, rendez-vous dans le fichier language > fr > common.php et recherchez ce bout de code :

'READING_FORUM'			=> 'Consulte les sujets dans %s',
'READING_GLOBAL_ANNOUNCE'	=> 'Consulte une annonce globale',

Et remplacez-le par celui-ci :

'RATES_AVERAGE'			=> 'Moyenne des notes',
'READING_FORUM'			=> 'Consulte les sujets dans %s',
'READING_GLOBAL_ANNOUNCE'	=> 'Consulte une annonce globale',

Encore une fois, on attribue une référence à une chaîne de caractère afin de l'afficher dans le squelette.

f - Ensuite, rendez-vous dans styles > votre style (prosilver par exemple) > template > viewtopic_body.html et recherchez ce bout de code :

<!-- IF postrow.POSTER_POSTS != '' --><dd><strong>{L_POSTS}:</strong> {postrow.POSTER_POSTS}</dd><!-- ENDIF -->

et remplacez-le par celui-ci :

<!-- IF postrow.POSTER_POSTS != '' --><dd><strong>{L_POSTS}:</strong> {postrow.POSTER_POSTS}</dd><!-- ENDIF -->
<!-- IF postrow.POSTER_RATES_AVERAGE != '' --><dd><strong>{L_RATES_AVERAGE}:</strong> 
{postrow.POSTER_RATES_AVERAGE}</dd><!-- ENDIF -->

Ici, on renseigne tout simplement nos références dans notre squelette, ce qui permet d'afficher toutes nos informations.

La manipulation est terminée ! Théoriquement, vous devriez voir la moyenne des notes de chaque membre en dessous leur avatar (comme sur l'image en haut du billet), sous réserve qu'ils aient posté des photos et que celles-ci aient été notées ;).

Si vous avez des questions et/ou des remarques, n'hésitez pas !

31 déc. 2008

Noobslide, un slideshow pour vos photos

Icone Heure 12:37 Icone Auteur Jean-Christophe Duvivier

Mots Clés Application, Frameworks, Masques, Mootools, Slideshow,

Icone MootoolsAprès quelques jours de silence, j'ai envie de vous faire découvrir noobslide, un Slideshow basé sur le Frameworks Mootools. "Découvrir" sous-entend "mini tuto", je vais me contenter d'une brève présentation qui je l'espère vous poussera à l'utiliser ;)

Sans plus attendre je vous invite sur le site efectorelativo.net qui propose 8 exemples d'utilisation de noobslide. Les effets sont variés et beaux visuellement.

1. Mise en place des scripts :

La mise en place du Slideshow est vraiment très simple.

Tout d'abord il faut inclure le script Mootools, et le script noobslide :

<script type="text/javascript" src="site/js/mootools.js"></script>
<script type="text/javascript" src="site/js/noobslide.js"></script>

Ensuite, insérez le script spécifique à votre modèle de noobslide dans le head. Il sera exécuté au chargement de votre page. Pour le modèle 1, cela donne ça :

window.addEvent('domready',function(){
 
var nS1 = new noobSlide({
box: $('box1'),
items: [0,1,2,3],
size: 480,
autoPlay: true
});
 
});

Vous pouvez récupérer le code correspondant à votre modèle directement dans le code source du site efectorelativo.net.

2. Mise en place des styles:

Au niveau des styles, il faut intégrer la feuille de style suivante (n'oubliez pas de supprimer les styles des modèles qui ne vous servent pas)

/* Sample 1*/
#box1{
	position:absolute;
}
#box1 span{
	display:block;
	float:left;
}
 
/* Sample 2*/
#box2{
	position:absolute;
}
#box2 span{
	display:block;
	float:left;
}
 
/* Sample 3*/
#box3{
	position:absolute;
}
#box3 span{
	display:block;
	float:left;
}
 
/* Sample 4*/
#box4{
	position:absolute;
}
#box4 div{
	width:480px;
	height:240px;
	float:left;
	background:#eee;
}
 
#box4 h3, #box4 p, #box4 ul{
	padding:5px 10px;
}
#box4 p{
	text-indent:16px;
}
#box4 img{
	width:200px;
	width:150px;
	float:left;
	margin:0 10px 10px 15px;
}
#info4{
	background:#fff !important;
	color:red !important;
	cursor:default
}
 
/* Sample 5*/
#box5{
	position:absolute;
	width:240px;
}
#box5 span{
	display:block;
}
#info5{
	bottom:0;
}
 
/* Sample 6*/
#box6{
	position:absolute;
	width:240px;
}
#box6 span{
	display:block;
}
#handles6_1{
	float:left
}
#handles6_2{
	float:right
}
.mask6{
	position:absolute;
	left:50%;
	margin-left:-120px;
	width:240px;
	height:180px;
	overflow:hidden;
}
.sample6 .buttons{
	clear:both;
	text-align:center;
}
 
/* Sample 7*/
#box7{
	position:absolute;
}
#box7 span{
	display:block;
	float:left;
}
 
#thumbs7{
	position:relative;
	width:486px;
	clear:both;
	height:41px;
	overflow:hidden;
	margin-top:200px;
}
#thumbs7 .thumbs, #thumbs_handles7, #thumbs_mask7{
	position:absolute;
	top:0;
	width:100%;
	height:41px;
}
#thumbs7 .thumbs div, #thumbs_handles7 span{
	display:block;
	width:60px;
	height:41px;
	margin:0;
	float:left;
	cursor:pointer;
}
#thumbs7 .thumbs div img{
	width:54px;
	float:right;
}
#thumbs_handles7 span{
	background:url(thumb_invisible.gif) no-repeat;
}
#thumbs_mask7{
	width:1200px;
	background:url(thumbs_mask.gif) no-repeat center top;
}
 
/* Sample 8*/
#box8{
	position:absolute;
}
#box8 div{
	width:480px;
	float:left;
}
#box8 .buttons{
	text-align:left
}
#box8 .next{
	float:right
}
.sample8 .buttons{
	text-align:center;
	clear:both;
}
.sample8 .mask1{
	border-top:1px solid #ccc;
	border-bottom:1px solid #ccc;
}
 
/* ********************************** */
 
.thumbs{
	width:54px;
}
.thumbs div{
	display:block;
	width:54px;
	height:41px;
	margin:3px 0;
	cursor:pointer;
}
 
.thumbs div img{
	display:block;
	width:100%;
	height:100%;
	border:none
}
 
.info{
	width:240px;
	height:50px;
	background:#000;
	position:absolute;
}
.info p, .info h4{
	color:#fff;
	padding:3px 8px;
	font-family:Arial;
}
.info h4{
	font-size:14px;
}
.info h4 a{
	float:right;
	background:#fff;
	color:#000;
	font-size:10px;
	padding:0 3px;
	text-decoration:none
}
 
.mask1{
	position:relative;
	width:480px;
	height:180px;
	overflow:hidden;
}
.mask2{
	position:relative;
	width:240px;
	height:180px;
	overflow:hidden;
}
.mask3{
	position:relative;
	width:480px;
	height:240px;
	overflow:hidden;
}
 
span img{
	display:block;
	border:none;
}

3. Mise en place du squelette :

Encore une fois, il va vous falloir fouiner dans le code source du site efectorelativo.net. Pour le modèle 1, on aurait ce squelette :

<h2>Sample 1</h2>
<div class="sample">
	<div class="mask1">
		<div id="box1">
			<span><img src="img1.jpg" alt="Photo" /></span>
			<span><img src="img2.jpg" alt="Photo" /></span>
			<span><img src="img3.jpg" alt="Photo" /></span>
 
			<span><img src="img4.jpg" alt="Photo" /></span>
			<span><img src="img5.jpg" alt="Photo" /></span>
			<span><img src="img6.jpg" alt="Photo" /></span>
			<span><img src="img7.jpg" alt="Photo" /></span>
			<span><img src="img8.jpg" alt="Photo" /></span>
		</div>
	</div>
</div>

Et voilà, votre Slideshow est en principe opérationnel ;) Il ne vous reste plus qu'à l'adapter à votre application, chose qui se révèle être beaucoup plus complexe que la mise en place. Il vous faudra gérer les positions des masques et des images ;)

13 déc. 2008

Exporter le résultat d'une requête SQL en CSV et XLS

Icone Heure 12:30 Icone Auteur Jean-Christophe Duvivier

Mots Clés PHP, SQL,

Je vous propose un petit script PHP afin d'exporter facilement vos données SQL en .CSV ou .XLS. C'est simple, compréhensible, et surtout, facile à mettre en place ;)

<?php
// Inclusion des paramètres de connexion à votre base de données
require_once('config.php');
 
// Titre des colonnes de votre fichier .CSV ou .XLS
$fichier = "Nom; Prenom; Mail; Adresse";
$fichier .= "\n";
 
// Requête SQL
$sql = "SELECT * FROM personnes";
$req = mysql_query($sql);
 
// Enregistrement des résultats ligne par ligne
while($row = mysql_fetch_object($req))
{
   $fichier .= "".$row->nom.";".$row->prenom.";".$row->mail.";".$row->adresse."\n";
}
 
// Déclaration du type de contenu
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=Personnes.csv"); // Remplacer .csv par .xls pour exporter en .XLS
print $fichier;
exit;
?>

Si vous remarquez une erreur qui s'est glissée dans le script ou si vous avez une question, n'hésitez pas à m'en faire part à la suite de ce sujet ;)

02 déc. 2008

Envoyer des emails de type texte et HTML avec pièces jointes en PHP

Icone Heure 19:13 Icone Auteur Jean-Christophe Duvivier

Mots Clés HTML, Mail, PHP,

Le but de ce tuto est de vous donner toutes les cartes afin que vous puissiez envoyer des emails de type "texte" ou "HTML" via PHP. Il ne se veut pas exhaustif, mais suffisamment complet pour répondre à la demande d'au moins 90% d'entre vous. J'estime que seules les personnes expérimentées auront besoin de créer des applications plus complexes (je généralise, mais c'est majoritairement le cas).

Ce tuto se veut succin mais pertinent. J'irai droit au but. L'envoi de Mail requiert la connaissance de paramètres, d'une syntaxe particulière... Soit vous l'apprenez par cœur, soit vous mettez ce tuto en marque page, il se révélera très pratique ;) Trêve de blabla. On y va.

1. Envoi de mail texte

L'envoi de mail se fait grâce à la fonction mail(). Elle prend au minimum 3 paramètres : le destinataire, le sujet et le message.

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule
$sujet = "Tuto - Envoi de mail";
 
/*---- Déclaration du message ----*/
$message = "Mon Message";
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message);
?>

Grâce à un 4ème paramètre (optionnel), l'entête, il vous est possible de renseigner davantage d'informations, tels que l'adresse email de l'expéditeur, ou encore la priorité du mail.

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule
$expediteur = "contact@jchristophe.fr";
$sujet = "Tuto envoi de mail";
 
/*---- Déclaration de l'entête ----*/
$entete = "From: $expediteur \n"; // Adresse de l'expéditeur
$entete .= "Reply-to: $expediteur \n"; // Adresse de réponse
$entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée
$entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché
$entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent
 
/*---- Déclaration du message ----*/
$message = "Mon Message"; // Pour sauter une ligne, écrire : \n
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message, $entete);
?>

2. Envoi de mail html

Pour envoyer un mail au format HTML, il suffit de déclarer le Content-Type du mail dans son entête. Vous pourrez ensuite utiliser toutes vos balises HTML dans votre message.

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule
$expediteur = "contact@jchristophe.fr";
$sujet = "Tuto envoi de mail";
 
/*---- Déclaration de l'entête ----*/
$entete = "From: $expediteur \n"; // Adresse de l'expéditeur
$entete .= "Reply-to: $expediteur \n"; // Adresse de réponse
$entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée
$entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché
$entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent
$entete .= "Content-Type: text/html \n"; // Type du mail : HTML
 
/*---- Déclaration du message ----*/
$message = "<html><body>";
$message .= "<strong>Mon Texte Gras</strong><br />";
$message .= "<font color=\'#ff0000\'>Mon Texte Rouge</font>";
$message .= "</body></html>",
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message, $entete);
?>

Concernant l'affichage des images, n'oubliez pas de renseigner l'url complète de votre image, que vous avez, au préalable, hébergé sur un serveur ;)

3. Envoi de mail avec pièce(s) jointe(s)

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "contact@jchristophe.fr"; // Pour plusieurs destinataires, les séparer par une virgule
$expediteur = "contact@jchristophe.fr";
$sujet = "Tuto envoi de mail";
 
$delimiteur = md5(uniqid(rand())); // Création d'un numéro unique, qui délimitera les différents blocs du mail
 
$piecejointe = "candidat.pdf"; // Déclaration du fichier à envoyer en tant que pièce jointe
$contenupiecejointe = file_get_contents($piecejointe); // Récupération du contenu du fichier
$contenupiecejointe = chunk_split(base64_encode($contenupiecejointe)); // Conversion du fichier : respect du format RFC 2045
$typepiecejointe = filetype($piecejointe); // Récupération du type du fichier
 
/*---- Déclaration de l'entête ----*/
$entete = "From: $expediteur \n";
$entete .= "Reply-to: $expediteur \n";
$entete .= "Cc: destinataire1@gmail.com \n";
$entete .= "Bcc: destinataire2@gmail.com \n";
$entete .= "X-Priority: 1 \n";
$entete .= "MIME-Version: 1.0 \n";
$entete .= "Content-Type: multipart/mixed; boundary=\"$delimiteur\" \n"; // Déclaration du type du mail et du délimiteur
$entete .= " \n";
 
/*---- Déclaration du message ----*/
$message = "--$delimiteur \n"; // Séparation du bloc "entete" et du bloc "message" par notre délimiteur
$message .= "Content-Type: text/html; charset=\"iso-8859-1\" \n"; // Déclaration du type du message ainsi que la charte de codage
$message .= "Content-Transfer-Encoding:8bit\n"; // Déclaration du type de codage
$message .= "\n";
$message .= "<strong>Mon Texte Gras</strong><br />";
$message .= "<font color=\"#ff0000\">Mon Texte Rouge</font>";
$message .= "\n";
 
/*---- Insertion de la pièce jointe ----*/
$message .= "--$delimiteur \n"; // Séparation du bloc "message" et du bloc "pièce jointe" par notre délimiteur
$message .= "Content-Type: $typepiecejointe; name=\"$piecejointe\" \n"; // Déclaration du type et du nom de la pièce jointe
$message .= "Content-Transfer-Encoding: base64 \n"; // Déclaration du type de codage
$message .= "Content-Disposition: attachment; filename=\"$piecejointe\" \n"; // attachment = pièce jointe = fichier à sauvegarder
$message .= "\n";
$message .= $contenupiecejointe." \n"; // Insertion du fichier
$message .= "\n";
$message .= "--$delimiteur"; // Délimitation de la fin de la pièce jointe, et du mail
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message, $entete);
?>

Et voilà ! Je pense avoir été assez précis, explicite et pertinent. Cependant, si vous avez des questions sur des éléments relatifs à l'envoi de mail en PHP présents, ou pas, dans ce tuto, je me ferai un plaisir de répondre dans la limite de mes compétences ;)

N'hésitez pas à réagir ;)

- page 1 de 3

Propulsé par Dotclear - Hebergé par Infomaniak - Thème Green Mantis par jchristophe
© jchristophe.fr 2008 - 2009
Valide CSS 2.1 CSS 2.1 Valide XHTML 1.0 XHTML Strict 1.0 Flux RSS RSS