Envoyer un flux RSS dans une newsletter
Sommaire
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 :
- des abonnés au format HTML
- un template que nous allons créer manuellement
- la fonction file_get_contents disponible (template PHP = template dynamique)
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.
- Rôle actif : récupérer le contenu du flux RSS que nous souhaitons envoyer.
- Rôle actif : lire et "parser" (c'est à dire interpréter séquentiuellement) le code du flux RSS reçu
- 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 :
- Chaque titre d'<item> sera une balise <h3> dans le corps de ma newsletter
- Chaque description sera un <p> dans le corps de ma newsletter
- le template contiendra bien entendu les marqueurs --NEWSLETTUX-- et --FOOTER--
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é :
- que je spécifie dans mon tableau $array_xml uniquement les balises XML comprises entre <item> et </item> que je souhaite pouvoir afficher ;
- à la fin, dans la partie "3. Affichage des données", que je dispose d'un tableau $rss dont les clés sont mes balises ...
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 !

