Retour vers CoRinne et VeRo >> **[[PlanDuSiteHtml Plan du site]]** >> TrucsEtAstuces >> FilRss
Tiré du site original [[http://www.wikini.net/ Wikini]] -> //#R#Je planche dessus pour comprendre#R# (CoRinne)//
==== #R#Servir des flux RSS pour tout ou partie du site#R# ====
Je ne suis pas sûr que servir des flux RSS (RDFSiteSummary) pour chaque page soit utile.
> je pense que si, par exemple pour effectuer une veille sur une sélection de pages de wikis distants (les uns des autres), et non sur un wiki dans son ensemble. --YannLeGuennec
On peut s'aider de :
- [[http://developpeur.journaldunet.com/tutoriel/xml/020913xml_rssauto.shtml Générer automatiquement un fichier RSS]], du JdN.
- [[http://www.phpspirit.com/?go=applications&id=2 La classe PhP easyRSS]] [fr], permettant de générer, mais aussi de lire simplement des flux RSS 0.91.
- Cette bibliothèque est minimale et gère avec simplicité la production comme la lecture de flux RSS 0.91. Son parsage est effectué à l'aide des expressions rationnelles, aussi ne requière-t-elle aucune configuration spéciale et est susceptible de fonctionner sur toute installation de PhP. (Je l'ai testée avec succès avec Wikini sur EasyPhp -- CharlesNepote.). Le seul endroit où cette bibliothèque semble encore téléchargeable est [[http://club2rencontres.free.fr/download/php/librairie_classe/index.php3 ici]].
- [[http://magpierss.sourceforge.net/ MagpieRSS]] [en] fournit un parseur RSS en PhP fondé sur expat (compatible 0.9x-1.0).
- Cette bibliothèque est très riche, acceptant toute version de flux RSS (hors 2.0), gérant les erreurs, etc. Elle est en outre simple à employer et rapidemment opérationnelle, pour peu que la configuration de PhP intègre les prérequis (qui sont par ailleurs mal documentés). Cette bibliothèque ne fonctionne pas, par exemple, avec EasyPhp.
- [[http://www.devarticles.com/art/1/238/1 Building a Generic RSS Class With PHP]] [en], par Mitchell Harper.
- [[http://www.phpclasses.org/search.html?words=RSS&go_search=1 Quelques classes php gérant RSS]] [en]. [Il est regrettable que l'inscription à www.phpclasses.org soit obligatoire pour accéder au source de ces classes -- DavidDelon]
- [[http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html Qu'est-ce que RSS ?]] [en] : description de RSS et de ses différentes versions.
- [[http://purl.org/rss/1.0/spec Spécification officielle de RSS 1.0]] [en].
- [[http://feeds.archive.org/validator/ RSS Validator]] [en].
- [[http://www.metacites.net/mot22.html Un introduction simple en français]] [fr].
- [[http://xmlfr.org/actualites/tech/001211-0001 RSS 1.0 disponible]] [fr].
- [[http://tech.motion-twin.com/?&node=8 Flash RSS]] [fr].
- [[http://www.w3.org/2002/09/rss2email rss2email, rss to email aggregator]] [en]
- Ici même, voir les LecteursdeFilsRSS.
-- CharlesNepote
D'autres pages que DerniersChangements peuvent être candidates à fournir un fil RSS : par exemple une page de "news" à étudier.
Pour les autres pages, c'est-à-dire les pages "traditionnelles", un fils RSS n'a de sens que si l'utilisateur indique en clair, dans un champ prévu à cet effet, le changement effectué sur la page : par exemple : "Ajout d'un lien vers XXXX" ; "amélioration de la définition des CSS" ; "correction d'orthographe sans importance" ; etc. A ce titre je trouve que la page [[http://tavi.sourceforge.net/RecentChanges RecentChanges]] de WikiTikkiTavi illustre bien cet exemple (bien que les gens ne renseignent pas systématiquement le champ prévu).
-- CharlesNepote
----
==== Générer un fil RSS ====
Depuis la version 0.1.1.0.3, Wikini produit un fil RSS à partir des derniers changements effectués sur le site. Cette fonctionnalité :
- est exploitable par tout lecteur sachant lire le format RSS version 0.91 (le plus répandu)
- est strictement respectueuse du standard RSS ; le fil est reconnu comme valide :
[[http://feeds.archive.org/validator/check?url=http://www.wikini.net/wakka.php?wiki=DerniersChangementsRSS/xml]]
- peut être mise en oeuvre dans n'importe quelle page à l'aide de l'action "recentchangesrss"
- est paramétrable afin de référencer l'adresse de la page des derniers changements
- si la page des derniers changements en référence n'existe pas, un contenu vide est alors retourné
- masque les aspects techniques
L'action recentchangesrss s'utilise comme une action normale, mais elle est à appeler avec le handler rss si on veut un résultat exploitable :
[[http://www.wikini.net/wakka.php?wiki=DerniersChangementsRSS/xml]].
Voilà ce que ça donne sur multiticker : """",
-- DavidDelon
=== Suggestion d'amélioration fonctionnelle ===
- Si la page des derniers changements en référence n'existe pas, un contenu vide est alors retourné : il faut peut etre décider de retourner quelquechose dans ce cas là -- DavidDelon
- On peut peut-être ajouter une icône orange "XML" (comme dans WakkaWiki) dans les DerniersChangements ? -- CharlesNepote [Pourquoi pas ? -- DavidDelon]
- Il faut peut-être aussi jeter un coup d'oeil la technique de "[[AutoDecouverteRss l'auto-découverte RSS]]" décrite [[http://diveintomark.org/archives/2002/05/30/rss_autodiscovery.html ici]] et [[http://diveintomark.org/archives/2002/05/31/more_on_rss_autodiscovery.html là]] -- CharlesNepote. [C'est interessant, facile à rajouter dans le footer par exemple -- DavidDelon]
- Est-ce qu'on pourrait mettre l'adresse de la page DerniersChangements au lieu de la page PagePrincipale lors de la création de ce flux RSS ? A chaque fois que je m'abonne à un flux d'une installation de Wikini, je dois changé ce paramètre pour suivre rapidement les trucs qui ont changés.
=== Réalisation technique ===
J'ai commencé à regarder EasyRSS, mais cette classe me semblait un peu trop lourde pour l'usage simple dont j'avais besoin : après tout, ce n'est pas plus dur d'afficher du RSS que du XHTML... j'ai donc codé "à la main", en m'inspirant des documents existants. C'est vraiment très simple (et on peut facilement passer à une classe comme EasyRSS si nos besoins sont plus importants ). -- DavidDelon
%%(php)
LoadRecentlyChanged($max))
$output = "\n";
$output .= "\n"; $output .= "\n";
$output .= " Derniers changements sur ". $this->config["wakka_name"] . "\n";
$output .= "" . $this->config["base_url"] . $this->config["root_page"] . "\n";
$output .= " Derniers changements sur " . $this->config["wakka_name"] . " \n";
$output .= "fr\n";
$output .= "\n";
foreach ($pages as $i => $page) {
$output .= "\n";
$output .= "" . $page["tag"] . " par " .$page["user"] . " le " . $page["time"] . "\n";
$output .= " Modification de " . $page["tag"] . " par " .$page["user"] . " le " . $page["time"] . "\n";
$output .= "" . $this->config["base_url"] . $page["tag"] . "\n";
$output .= "\n";
}
$output .= "\n";
print($output);
}
?>
%%
Questions de CharlesNepote.
- Par ailleurs, pourquoi avoir choisi un nouvel handler ?
[ Bonne question : je pouvais créer une page speciale, gérée par le système, et renvoyant systématiquement le flux rss des derniers changements comme par exemple : WikiniRSS, probleme : risque de conflit avec une page existante.; je ne pouvais pas utiliser le handler show (il retourne un header et footer) ni le handler raw (il ne formate pas le contenu d'une page, ce contenu est destiné à être interprété par un autre WikiNi), le plus logique : créer un nouvel handler spécifique au xml et ainsi garder la modularité de wikini : on peut créer autant d'action que l'on veut pour afficher le flux rss que l'on veut dans la page de son choix -- DavidDelon ]
- Ce qui me gêne, dans cette solution, c'est que l'utilisateur novice, s'il clique par hasard sur DerniersChangementsRSS, va se retrouver avec une page à laquelle il ne va rien comprendre... je ne trouve pas ça très "wiki"... En règle général, je pense qu'il faut masquer toute information technique à l'utilisateur (sans valeur ajoutée pour lui). L'idéal, d'un point de vu fonctionnel, serait qu'il visualise une page (DerniersChangementsRSS/show) qui lui explique comment utiliser un fils RSS.
D'un point de vu technique :
- soit on supprime toute page contenant recentchangesrss des DerniersChangements ou PagesOrphelines ou autres (ça me paraît pas envisageable) ;
- soit on fait en sorte que DerniersChangementsRSS/show n'affiche que du texte en clair et DerniersChangementsRSS/xml le fil RSS. -- CharlesNepote.
[ Ca doit être possible, puisque c'est dans show et xml que l'on décide de la méthode d'affichage, show peut appeller le formatage standard, tandis que xml peut appeller un formatage simplifié, il faut donc trouver une notation qui cache une action dans le formatage standard et qui l'appelle dans le formatage simplifié, et qui ne considère que les actions. Une triple accolade { ? -- DavidDelon ]
[ Je viens de voir ton exemple dans le BacASable, bonne idée, j'ai donc crée un formatter : action.php, qui ne fait que traiter des actions, il est appellé par le handler xml , resultat ici [[http://www.wikini.net/wakka.php?wiki=DerniersChangementsRSS/xml]] et là : DerniersChangementsRSS -- DavidDelon ]
Comme je l'ai dit ailleurs, ce fichier pourrait ne faire que trois lignes... oh et puis une seule ça devrait suffire ;-) J'ai testé, ça marche:
##""echo $text = preg_replace('/(\{\{(.+)\}\})/eU', '$this->Action(\'\\2\')', trim(str_replace("\r", '', $text)) . "\n");""##
J'ai viré l'option de recherche ##/m## qui était totalement inutile (aucun détecteur de début ou de fin de chaine dans la regexp) et ##/s## car il ne peut pas y avoir de retour à la ligne dans l'appel d'une action. L'option ##/e## sert à évaluer la partie ##replacement## comme du code PhP, après avoir substitué les références arrières dedans.
J'imagine que maintenant on peut aussi virer le ##echo## qu'il y a là... (s'il y a bien un truc que je n'aime pas du tout dans WikiNi, c'est l'utilisation intensive des fonctions ob...) -- LordFarquaad
- Enfin, le rendu dans un navigateur n'est pas satisfaisant. Je sais que ça n'est pas le but, mais les flux RSS de WakaWikki, par exemple, sont rendus comme des fichiers XML dans InternetExplorer 5 ou dans MoZilla. Dans MoZilla, le "type", donné dans les informations relatives à la page, correspond à "text/xml". "recentchangesrss" produit quant à lui un type "text/html".
[ Modifié en utilisant l'instruction PhP "header("Content-type: text/xml");" -- DavidDelon ]
OK. Ca marche pour MoZilla et IE 5.0 ; mais du coup, Netscape 4.7 ne le lit plus et propose de le télécharger (ce qui est normal... est-ce génant ?
[ Ce n'est pas génant à mon avis, vu la politique que nous avons retenu pour NN4.7 -- DavidDelon ]).
Pour ce genre de modification, touchant au type du contenu, je suggère de recetter sur un panel de clients le plus large possible : qu'est-ce que ça donne sur Lynx et autres ? -- CharlesNepote.
[ Testé sur lynx : idem, il propose de le télécharger, à cause de l'encoding gzip qui ne fonctionne qu'avec du Content type text/html (par défaut ? à voir ...), du coup j'ai désactivé, pour le moment, la compression pour le handler xml ... Par contre sur Galeon/linux, Mozilla/linux : pas de problème -- DavidDelon ]
- Le début du fichier RSS généré contient "" comme dans les flux RSS [[http://openwiki.com/?a=rss d'OpenWiki]], ce qui permet de visualiser quel outil a généré ce flux. En outre on visualise tout de suite dans MoZilla la version RSS (0.91), sans passer par l'affichage de la source. -- CharlesNepote
Suite à quelques problèmes de lecture dans Maxthon, j'ai modifié l'ActionRecentChangesRSS et j'en ai profité pour appliquer quelques corrections sémantiques (en m'inspirant de l'un ou l'autre flux rss, principalement ceux de [[http://www.phpbb.com/rss.php phpBB]] et [[http://www.dotclear.net/dotclear/rss.php DotClear]]). Voici ma source (j'ai commenté l'ancien code ce qui permet de comparer facilement):
%%(php)GetUser())
{
$max = $user["changescount"];
}
else
{
$max = 50;
}
if ($pages = $this->LoadRecentlyChanged($max))
{
if (!($link = $this->GetParameter("link"))) $link=$this->config["root_page"];
$output = "\n";
/*
$output .= "\n";
$output .= "\n";
*/
$output .= '' . "\n";
$output .= "\n";
$output .= " Derniers changements sur ". $this->config["wakka_name"] . "\n";
$output .= "" . $this->config["base_url"] . $link . "\n";
$output .= " Derniers changements sur " . $this->config["wakka_name"] . " \n";
$output .= "fr\n";
$output .= 'WikiNi ' . WIKINI_VERSION . "\n";
foreach ($pages as $i => $page)
{
/*
list($day, $time) = explode(" ", $page["time"]);
$day= preg_replace("/-/", " ", $day);
list($hh,$mm,$ss) = explode(":", $time);
*/
$output .= "\n";
$output .= "" . $page["tag"] . "\n";
$output .= '' . $page["user"] . "\n";
$output .= '' . $page['time'] . "\n";
$output .= " Modification de " . $page["tag"] . " --- par " .$page["user"] /* . " le " . $day ." - ". $hh .":". $mm */ . "\n";
$output .= "" . $this->config["base_url"] . $page["tag"] . "&time=" . rawurlencode($page["time"]) . "\n";
$output .= "\n";
}
$output .= "\n";
$output .= "\n";
// $output .= "\n";
echo $output ;
}
?>%%
Ah oui, j'allais oublier: [[http://fsa.notredomaine.org/wiki/DerniersChangementsRSS/xml demo]]
-- LordFarquaad
---
Merci pour tout ce magnifique boulot !
Remarque d'un distrait : l'action s'installe dans une page spéciale nommée DerniersChangements**RSS** et non dans la page DerniersChangements.
J'ai mis ce script dans le fichier footer.php après
.
Remarque ( à généraliser ?): J'utilise un nouveau paramètre indiquant l'endroit d'un dossier "image" où j'ai installé l'image xml.gif représentant le petit rectangle xml orange ( et toutes les autres images d'ailleurs)
Améliorations bienvenues . Merci --FidelioEspoir.
%%
GetConfigValue("base_url") ?>DerniersChangementsRSS"> /xml.gif" title="Copiez ce lien et collez le dans votre lecteur de news."> ::%%
--------------
====Handler pour produire un fil rss pour l'historique de chaque page====
- nom: revisionsrss.php
- exemple : http://www.x-arn.org/w/PagePrincipale/revisionsrss
%%(php)
HasAccess("read"))
{
return;
}
else
{
// On teste si la page existe
if (!$this->page)
{
return;
}
else
{
header("Content-Type: application/rss+xml");
$output = "\n";
if ($pages = $this->LoadRevisions($this->tag))
{
$output .= "\n";
$output .= " \n";
$output .= " ".$this->config["wakka_name"].": ".$this->tag."\n";
$output .= " ".$this->config["base_url"].$this->tag."\n";
$output .= " \n";
$output .= " fr\n";
foreach ($pages as $page)
{
$url = $this->href("show")."&time=".urlencode($page["time"]);
$output .= " \r\n";
$output .= " ".$page["time"] ." by ".$page["user"]. "\r\n";
$output .= " " . $url . "\r\n";
$output .= " \r\n";
$output .= " by ".$page["user"]."\r\n";
$output .= " ".ereg_replace(" ","T",$page["time"])."-01:00\r\n";
$output .= " \r\n";
}
$output .= " \r\n";
$output .= "";
print($output);
}
}
}
?>
%%
-----
solution pour réduire la charge sur le serveur lors de la lecture du fil des DerniersChangements : enregistrer un fichier .xml statique lors de l'enregistrement d'une page (et non appeler la base pour générer le fil à chaque requête HTTP)
- dans la fonction SavePage de wakka.php , rajouter en fin de fonction (vers ligne 245) un : ""include("update_rss.php");""
%%(php)
LoadRecentlyChanged($max))
{
if (!($link = $this->GetParameter("link"))) $link=$this->config["root_page"];
$output = "\n";
$output .= "\n";
$output .= "\n";
$output .= "\n";
$output .= " Derniers changements sur ". $this->config["wakka_name"] . "\n";
$output .= "" . $this->config["base_url"] . $link . "\n";
$output .= " Derniers changements sur " . $this->config["wakka_name"] . " \n";
$output .= "fr\n";
$output .= "\n";
foreach ($pages as $i => $page)
{
list($day, $time) = explode(" ", $page["time"]);
$day= preg_replace("/-/", " ", $day);
list($hh,$mm,$ss) = explode(":", $time);
$output .= "\n";
$output .= "" . $page["tag"] . "\n";//. " --- par " .$page["user"] . " le " . $day ." - ". $hh .":". $mm .
$output .= " Modification de " . $page["tag"] . " --- par " .$page["user"] . " le " . $day ." - ". $hh .":". $mm . "\n";
$output .= "" . $this->config["base_url"] . $page["tag"] . "&time=" . rawurlencode($page["time"]) . "\n";
$output .= "\n";
}
$output .= "\n";
$f = @fopen("x/rss.xml","w"); // fichier RSS statique dans le dossier 'x'
if($f) {
fputs($f,$output) ;
fclose($f);
}
}
?>
%%
Il s'agit d'une simple modification de l'action RSS de DavidDelon, placé à la racine du wiki (pour l'include) et non dans les actions.
Dans le cas présenté, le fichier statique **rss.xml** est placé dans le même dossier que les styles .css (dossier 'x' dans l'exemple) because ReEcritureURL et pour que ça marche en SafeMode ...
------
question par RobinMeier:
mais comment il faut faire pour inclure une partie du contenu d'une page qui a été changé dans le fils RSS ? j'ai regardé le fichier recentchangesrss.php mais je m'y connais pas assez pour pouvoir l'éditer correctement...
Très bonne et interessante question, j'avais regarder un moment donné le calcul des //diffs// et ça m'avait semblé assez compliqué...Il serait en tout cas très intéressant d'avoir cette //diff// dans le RSS, le champ description est assez vide pour le moment. On pourrait aussi formater la date et l'auteur de la modife correctement dans les champs adhoc dc:date etc... --YannLeGuennec