Afficher des flux RSS provenant d'autres sites
Besoins
On doit pouvoir faire une nouvelle "action" wikini qui s'insère, par exemple, dans n'importe quelle page sous la forme :
{{readRSS backend="http://www.wakkawiki.com/xml/recentchanges_wakkawiki.xml"}}
WikiNi est utilisé dans certains cas pour gérer des sites complets et cette fonctionnalité peut, dans ce cas, trouver d'intéressants usages :
- affichage sur un portail des nouvelles des sites liés à ce portail
- enrichissement d'un tableau de bord où l'on peut alors gérer plusieurs wikis : l'expérience montre que souvent un animateur de wiki anime plusieurs wikis
- affichage des nouvelles du site d'un blogueur participant au wiki (pratique courrante sur CraoWiki)
- affichage d'une page de synthèse pour les "veilleurs", en ligne, sans avoir à s'abonner à un service ou s'enregistrer et sans avoir à se déplacer avec son agrégateur favori
--
CharlesNepote
Solution avec la bibliothèque EasyRSS
Avec la bibliothèque
EasyRSS, j'obtiens des résultats satisfaisants. Pour tester, j'ai créé l'action rss.php ci-dessous, en quelques secondes, à partir du fichier fournit en exemple :
<?php
// ------------------------------------------------------------------------- //
// exemple2.php - parser le fichier des news de Phpinfo.net et afficher //
// ------------------------------------------------------------------------- //
// Copyright (C) 2001-2002 Philippe RODIER <webmaster@phpspirit.com> //
// ------------------------------------------------------------------------- //
// PHPSPIRIT <http://www.phpspirit.com/> //
// ------------------------------------------------------------------------- //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
// ------------------------------------------------------------------------- //
// la classe easyRSS
include('easyRSS.inc.php');
// créer l'instance
$phpinfo_rss = new easyRSS();
// parser le fichier news sur phpinfo.net et limiter à 20 news max
// soyez connecté au web :)
$phpinfo_rss -> parsefile("http://nospoon.org/backend_rdf.xml", 20);
// on s'amuse à afficher les infos (cad les news) avec une petite mise en page
echo "
<table bgcolor=\"#cccccc\" >
<tr>
<td height=\"40\">
<div align=\"center\">
<a href=\"".$phpinfo_rss -> get_image_link()."\">
<img src=\"".$phpinfo_rss -> get_image_url()."\" width=\"".$phpinfo_rss -> get_image_width()."\"
height=\"".$phpinfo_rss -> get_image_height()."\" border=\"0\"
alt=\"".$phpinfo_rss -> get_image_title()."\">
</a>
</div>
</td>
</tr>
<tr>
<td>
";
$nbnews = $phpinfo_rss -> get_num_items();
$news_title = $phpinfo_rss -> get_items_title();
$news_link = $phpinfo_rss -> get_items_link();
for($i=1;$i<=$nbnews;$i++)
{
echo "· <a href=\"".$news_link[$i]."\" target=\"_blank\">".$news_title[$i]."</a><br />\n";
}
echo "</td>
</tr>\n";
if($phpinfo_rss -> exist_textinput())
{
echo "<tr>
<td>
<br>
<form method=\"get\" action=\"".$phpinfo_rss -> get_textinput_link()."\">
".$phpinfo_rss -> get_textinput_description()."
<input type=\"text\" name=\"".$phpinfo_rss -> get_textinput_name()."\"
size=\"10\" maxlength=\"10\"> <input type=\"submit\" name=\"Submit\"
value=\"".$phpinfo_rss -> get_textinput_title()."\">
</form>
</td>
</tr>";
}
echo "</table>\n";
//exit();
?>
Dans cet exemple, le lien vers le flux RSS est codé en dur, mais il ne doit pas être difficile de le passer en paramètre.
--
CharlesNepote
Note : au moment de ces tests j'avais noté des problèmes que j'ai aujourd'hui oublié. C'est la raison pour laquelle je me suis tourné vers la bibliothèque
MagPie? (voir ci-dessous), très riche et bien suivie.
A faire : lister les contraintes de cette solution : pré requis, contraintes, etc.
--
CharlesNepote
Solution avec la bibliothèque MagPie?
Pré-requis :
- fonctionne avec PHP 4.2 (pas testé avec d'autres versions)
Avantages :
- gère RSS 0.9-1.0-2.0 et Atom
- gestion transparente d'un cache (fixé à une heure par défaut)
- très simple d'emploi
Cette méthode est fonctionnelle avec la version 0.61 de
MagPie? RSS.
- télécharger la bibliothèque en version 0.61
- décompacter à la racine de wikini
- ajouter l'action ci-dessous et c'est fini
Exemple d'usage :
{{rss url="http://conforme.phidji.com/database/index.rdf" class="right solid_border gray_background small_fonts height15em"}}
Ce premier jet de code est améliorable mais il fonctionne correctement.
Amélioration possibles :
- stylage des puces
- agrégation de plusieurs flux, les items de chaque flux étant mélangés et classés par ordre chronologique (un peu comme des courriels provenant de différentes personnes)
- logo du site
- réglage du temps de cache
<?php
// rss.php version 0.2 du 24/05/2004
// Action pour WikiNi 0.4.1rc et supérieurs
// Permet d'afficher un flux RSS
//
// Paramètres :
// -- url : URL du flux à afficher (obligatoire)
// -- class : nom de la classe de style à inclure (facultatif)
//
// copyrigth Charles Népote malito:charles02@nepote.org
//
// Licence GPL, vous êtes libre d'utiliser et de modifier ce code à condition de
// laisser le copyright d'origine. Vous pouvez bien sur vous ajouter à la liste
// des auteurs.
// Installation
// - copier le fichier dans le repertoire "actions" de WikiNi
// - installer magpierss-0.61 dans la racine de wikini
//
require_once '/../magpierss-0.61/rss_fetch.inc';
if (!$this->GetParameter("url"))
{
echo
"<p>Vous devez spécifier une adresse à l'aide du paramètre \"url\".</p>",
"<p>Par exemple : <pre>{{rss url=\"http://example.org/flux.rss\"}}</pre></p>";
}
else
{
$url = $this->GetParameter("url");
// Code de lecture des classes de style pompé sur l'action include
if ($this->GetParameter("class"))
{
$array_classes = explode(" ", $this->GetParameter("class"));
foreach ($array_classes as $c)
{
$classes = $classes . "include_" . $c . " ";
}
}
$rss = fetch_rss($url);
// Calcul des items
//
foreach ($rss->items as $item)
{
$title = $item[title];
$url = $item[link];
$output .= "<li><a href=$url>$title</a></li>\n";
}
// Calcul du titre
//
if ($rss->channel['link'])
{
$title = "<a href=\"".$rss->channel['link']."\">".$rss->channel['title']."</a>";
}
else
{
$title = $rss->channel['title'];
}
// Affichage
//
echo "<div class=\"", $classes, "\">\n",
"<p>Site : ", $title, "</p>\n",
"<ul>\n",
$output,
"</ul>\n",
"</div>\n";
}
?>
Pour ceux qui veulent modifier la valeur du cache par défaut, il faut modifier la ligne suivante dans le fichier
/magpierss-0.61/rss_cache.inc
var $MAX_AGE = 3600; // when are files stale, default one hour
Pour ceux qui sont derrière un proxy, il faut aller configurer à la main les valeurs du proxy dans le fichier
/magpierss-0.61/extlib/Snoopy.class.inc.
--
CharlesNepote
Solution avec le parser XML de PHP
- avantage: ne necessite pas d'installations supplémentaires
- à peaufiner : code brut, parametre encoding pas encore testé
<?php
/*
Action RSS reader pour wikini
usage: {{rssreader url="http://serveur.tld/url_du_flux_rss"}}
*/
$store = FALSE;
$cur_tag = "";
$cur_data = "";
$cur_item = array('titre'=>'', 'url'=>'', 'contenu'=>'','dat'=>'');
if (!function_exists("startElement")) {
function startElement($parser, $name, $attribs) {
global $cur_tag, $cur_data, $cur_item, $store;
if($name == "ITEM") {
$store = TRUE;
}
$cur_tag = $name;
$cur_data = "";
}
}
if (!function_exists("endElement")) {
function endElement($parser, $name) {
global $cur_item, $store;
if($name == "ITEM") {
echo "";
if($cur_item['dat'] != '') {
$dat = eregi_replace("T"," ",$cur_item['dat']);
}
if($cur_item['contenu'] != '') {
echo "<h3><a href=\"".$cur_item['url']."\">".$cur_item['titre']."</a></h3>";
echo "<p> (" . $dat . ") ". $cur_item['contenu']."</p>\r\n";
} else {
echo "$dat: <a href=\"".$cur_item['url']."\">".$cur_item['titre']."</a><br />\n";
}
$cur_item['titre'] = '';
$cur_item['url'] = '';
$cur_item['contenu'] = '';
$cur_item['dat'] = '';
$store= FALSE;
}
}
}
if (!function_exists("characterData")) {
function characterData ($parser, $data) {
global $cur_tag, $cur_item, $store;
if($store == TRUE) {
if($cur_tag == "TITLE") {
$cur_item['titre'] .= rtrim($data);
}
else if ($cur_tag == "LINK") {
$cur_item['url'] .= rtrim($data);
}
else if($cur_tag == "DESCRIPTION") {
$cur_item['contenu'] .= $data;
}
else if($cur_tag == "DC:DATE") {
$cur_item['dat'] .= $data;
}
}
}
}
$encoding = $this->GetParameter("encoding");
$xml_file = $this->GetParameter("url");
if (empty($encoding)) {
$encoding = "iso-8859-1";
}
if($fp = @fopen($xml_file, "r")) {
echo "<a href=\"$xml_file\">RSS</a><br />";
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, 'startElement','endElement');
xml_set_character_data_handler($xml_parser, 'characterData');
while ($data = fread($fp, 4096)) {
if($encoding == "utf-8") {
$data = utf8_decode($data);
}
xml_parse($xml_parser, $data);
}
fclose($fp);
xml_parser_free ($xml_parser);
}
?>
Discussions
Je ne suis pas convaincu à 100% de l'interêt pour
WikiNi de lire des flux RSS, puisque, pour moi, l'interêt majeur d'un flux RSS est de fournir un flux à lire hors web, dans une application spécialisée (comme multiticker sous gnome/linux par exemple), quant à ce qui est de la fourniture d'un flux RSS (sur
DerniersChangements surtout): tout à fait d'accord.
Comme de toute façon, la création d'une action supplémentaire n'impacte pas vraiment le coeur
WikiNi, pas de problème pour voir une telle action se développer. Les lois de la sélection naturelle feront émerger les actions les plus indispensables !
--
DavidDelon