PHP-Astux.info

Veni, vidi ... Tuxi !

Envoyer un flux RSS dans une newsletter

Sommaire

  1. Principe d'action
  2. Prérequis et alerte
  3. Le code source
  4. Mise en application

Principe d'action

Le but de ce tutoriel est d'inclure le contenu d'un flux RSS dans la newsletter que vous envoyez à vos visiteurs. Pour ce faire, nous allons créer une page simple, et nous verrons en fin d'article la procédure à suivre pour réaliser cette technique.

Prérequis et alerte

Alerte !

Cet article présente l'envoi de données en HTML. Il faudra pour cela utiliser un template dynamique donc les abonnés texte ne verront rien.

Les prérequis

Les prérequis sont assez simples :

Le code source

Pour réaliser cela, nous allons créer un template PHP dynamique. Ce template aura deux rôles actifs et un rôle passif.

  1. Rôle actif : récupérer le contenu du flux RSS que nous souhaitons envoyer.
  2. Rôle actif : lire et "parser" (c'est à dire interpréter séquentiuellement) le code du flux RSS reçu
  3. Rôle passif : mettre en forme le flux.

Le flux RSS

Il y a, à l'heure actuelle, deux grandes spécifications de flux RSS. Peu importe la spécification que vous avez, le but est de retenir le principe. Je présenterai ici la méthode pour tous les flux RSS : si vous constatez quelques divergences dans le vôtre, vous n'aurez que quelques adaptations à faire..

Pour rappel, le flux RSS est un fichier de code XML présentant un ensemble de données structurées. Par exemple, toutes les dernières newsletters envoyées.

Je présenterai donc la méthode pour la spécification ATOM 1.0 ... La différence entre ATOM 1.0 et RSS 2.0 dans cet article tiendra juste aux balises XML utilisées. Quelle que soit donc la méthode d'écriture, le principe de cet article reste le même.

Voici à quoi ressemble un flux RSS. Les balises peuvent différer, mais l'essentiel y est :

<?xml version="1.0" encoding="ISO-8859-15" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>Ici le titre du flux RSS</title>
	<link>http://www.php-astux.info/</link>
	<description>Description du flux RSS</description>
	<language>fr-fr</language>
	<pubDate>Mon, 28 Jul 08 19:48:45 +0200</pubDate>

	<copyright>Copyright http://www.php-astux.info</copyright>
	<atom:link href="http://url_vers_le_flux_rss.extension" rel="self" type="application/rss+xml" />

	<item>
		<title>voici la dernière newsletter</title>
		<link>Le lien vers cette newsletter</link>
		<guid>un ID ...</guid>

		<author>Matthieu</author>
		<category>NewsletTux </category>
		<pubDate>Tue, 15 Jul 08 21:25:11 +0200</pubDate>
		<description><![CDATA[Et ici le contenu des données envoyées dans le flux RSS]]></description>
	</item>

	<item>
		... [ même enchainement de balises que précédemment ]
	</item>
</channel>
</rss>

Pour le reste de ce tutoriel, je supposerai que ce flux RSS est un fichier présent sur votre site Web (ou ailleurs, au final, cela importe peu) accessible via l'URL : http://www.lesite.ext/flux_rss.ext. Que le fichier soit flux_rss.xml ou flux_rss.php importe peu également, le principal est que lorsqu'on appelle son URL, on tombe bien sur un code XML qui ressemble à celui publié plus haut.

Le template

Afin d'assurer son rôle passif, qui est la mise en forme des données, je supposerai ces hypothèses :

Voici, très sommairement, un exemple de template. Il doit être enregistré sous le nom de XXX.php, peu importe le XXX bien entendu, vous aurez compris que l'extension PHP est importante.

<html>
<head>
	<title>Newsletter PHP-Astux</title>
	<style type="text/css">
		/* titres des items */
	#rss { float:right; width:40%; height:500px; overflow:auto; }
	#rss h3 { color:#090; border-bottom:2px dotted #090; text-align:right; font-variant:small-caps; }

		/* paragraphes des items */
	#rss p { color: #009; margin:1em; font-family:Verdana; text-align:justify; }
	</style>
</head>
<body>
	<p>
--NEWSLETTUX--
	</p>
	<p>Ici se situe un exemple de texte lisible dans la newsletter.</p>
	<p>Lisez également nos derniers sujets :</p>

<?php
	/* -------------------------------------------------------------------------------------- */
	/* MINI CONFIG                                                                            */
	/* -------------------------------------------------------------------------------------- */
	// Nous allons récupérer le flux RSS sous forme de texte
	// renseignez ici l'URL complète du flux RSS
	$url_flux = 'http://www.monsite.tld/flux_rss.ext';

	// Renseignez ici toutes les balises XML que vous avez entre <item> et </item>
	// que vous souhaitez pouvoir afficher dans le corps de la newsletter
	$array_xml = array('<title>' => '</title>',
						'<link>' => '</link>',
						'<description>' => '</description>');

	/* -------------------------------------------------------------------------------------- */
	/* FIN MINI CONFIG                                                                        */
	/* -------------------------------------------------------------------------------------- */

	function RemplaceBalises($item)
	{
		global $array_xml;
		$array_return = array();

		$item = RemoveCRLF($item);
		$item = str_replace("\t", '', $item);

		// on récupère le texte nécessaire
		foreach($array_xml as $key => $value)
		{
			$pattern = $key."(.+)+".$value;
			eregi($pattern,$item,$regs);
			$array_return[$key] = $regs[1];
		};
		return $array_return;
	};

	// 2. Lecture séquentielle
	require('../../lib/functions_text.php');
	require('../../lib/functions_files.php');
	$array_final_rss = array(); // ce qu'on affichera au final
	$idx = 0;
	$fluxrss = ReadExternalFile($url_flux);

	// Remplacement des balises finales
	$fluxrss = str_replace('<![CDATA[', '', $fluxrss);
	$fluxrss = str_replace(']]>', '', $fluxrss);
	$fluxrss = str_replace('</item>', '', $fluxrss);
	$fluxrss = str_replace('</channel>', '', $fluxrss);
	$fluxrss = str_replace('</rss>', '', $fluxrss);

	$array_rss = explode('<item>', $fluxrss);
	array_shift($array_rss);

	foreach($array_rss as $i => $item)
	{
		$array_final_rss[$idx] = RemplaceBalises($item);
		$idx++;
	};

	// 3. Affichage des données
	echo '<div id="rss">';

	foreach($array_final_rss as $idx => $rss)
	{
		echo '<h3>'.$rss['<title>'].' <a href="'.$rss['<link>'].'">[ LIEN ]</a></h3>';
		echo '<p>'.html_entity_decode($rss['<description>']).'</p>';
	};
	echo '</div>';
?>
	<div id="footer">
--FOOTER--
	</div>
</body>
</html>

Dans ce template, vous aurez remarqué :

En d'autres termes, en suivant cette technique, si vous mettez <matthieu> => </matthieu> alors vous pourrez utiliser $rss['<matthieu>'].

Attention, dans la <description> j'ai utilisé la fonction html_entity_decode afin de restaurer les caractères HTML.

Vous êtes libre de personnaliser à souhait l'affichage, j'ai imaginé ici un affichage en 2 colonnes dont celle de droite est le flux RSS, et celle de gauche, non représentée, peut servir p.ex. pour un autre flux RSS... Jouez avec les styles CSS pour créer vos templates persos !