Il est possible avec Dotclear et les plugins twMeta et twTags de marquer les billets par des mots clés appelés 'tag'. Le système permet de visualiser l'ensemble des billets marqués d'un tag particulier, ou de naviguer en cliquant dans un 'nuage de tag', le Tagcloud.
D'origine Dotclear permet la génération de flux de syndication au format RSS 1.0. Ces flux peuvent contenir en fonction de l'URL d'appel :
- les derniers billets du blog
- les derniers billets d'une catégorie
- les derniers commentaires du blog
- les derniers commentaires d'une catégorie
- les derniers commentaires d'un billet
Pour le quatre premiers flux, il est possible de restreindre la génération aux seules informations disponible dans une langue donnée.
De plus selon une option choisie dans la partie administration, ces flux peuvent contenir les informations complètes, ou tronquées.
Comme l'a fait remarquer Empyrée, il n'est pas possible de générer des flux relatif à un tag. J'ai donc modifié le script produisant ces flux pour permettre la génération de flux par tag. Le flux dans ce cas, ne contient que les billets marqués d'un certain tag.
Le fichier s'appelle rss.php , et il est normalement situé dans le répertoire d'installation de Dotclear. Les modifications sont simples : récupération du paramètre $tag, chargement du plugin twMeta, appel de la fonction listant les billet par tag de ce plugin. La suite des traitement est inchangée, exploitation de la liste générée pour produire un flux RSS valide.
[php]
# ***** BEGIN LICENSE BLOCK *****
# This file is part of DotClear.
# Copyright (c) 2004 Olivier Meunier and contributors. All rights
# reserved.
#
# DotClear 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.
#
# DotClear 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 DotClear; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# ***** END LICENSE BLOCK *****
$app_path = '/';
require dirname(__FILE__).$app_path.'inc/prepend.php';
require dirname(__FILE__).$app_path.'layout/lib.cache.php';
require dirname(__FILE__).$app_path.'layout/class.xblog.php';
require dirname(__FILE__).$app_path.'layout/class.xblogpost.php';
require dirname(__FILE__).$app_path.'layout/class.xblogcomment.php';
if (file_exists(dirname(__FILE__).$app_path.DC_ECRIRE.'/tools/twpostmeta/functions.php')) {
require dirname(__FILE__).$app_path.DC_ECRIRE.'/tools/twpostmeta/functions.php';
$meta_plug = true;
} else {
$meta_plug = false;
}
//JL 2006-02 add RSS/tag
//$type = (!empty($_GET['type']) && $_GET['type'] == 'co') ? 'co' : 'blog';
$type = (!empty($_GET['type']) && ($_GET['type'] == 'co' or $_GET['type'] == 'tag')) ? $_GET['type'] : 'blog';
//$type = (!empty($_GET['type'])) ? $_GET['type'] : 'blog';
$tag = (!empty($_GET['tag'])) ? $_GET['tag'] : '';
$cat = (!empty($_GET['cat'])) ? $_GET['cat'] : '';
$lang = (!empty($_GET['lang'])) ? $_GET['lang'] : '';
# Connexion MySQL
$con = new Connection(DB_USER,DB_PASS,DB_HOST,DB_DBASE);
if ($con->error()) { exit; }
# Création de l'objet de type weblog avec uniquement les billets
# publiés
$blog = new xblog($con,DB_PREFIX,1,dc_encoding);
$blog->rs_blogpost = 'xblogpost';
$blog->rs_blogcomment = 'xblogcomment';
$blog->setURL('post','http://'.$_SERVER['HTTP_HOST'].dc_blog_url.dc_format_post_url);
# Si type = co on fait un fil des commentaires
if ($type == 'co')
{
if (!empty($_GET['post'])) {
$comments = $blog->getComments($_GET['post'],'DESC');
} else {
$comments = $blog->getComments('','DESC',20);
}
$title = dc_blog_name.' - Commentaires';
$ts = time();
$items = $seq = '';
if (!$comments->isEmpty())
{
$ts = $comments->getTS();
while(!$comments->EOF())
{
$seq .= $comments->getRSSSeq();
$items .= $comments->getRSSItem(dc_short_feeds);
$comments->moveNext();
}
}
}
else
{
//JL 2006-02 add RSS/tag
# par tag
if ($meta_plug == true && $type == 'tag'){
$news = twPostMeta::getLastNews('tag', $tag, 10, 'post_dt DESC', $lang);
} else {
# Dernières nouvelles
$news = $blog->getLastNews(10,$cat,'post_dt DESC',false,$lang);
}
$ts = strtotime($blog->getEarlierDate());
$title = dc_blog_name;
$items = $seq = '';
while(!$news->EOF())
{
$items .= $news->getRSSItem(dc_short_feeds);
$seq .= $news->getRSSSeq();
$news->moveNext();
}
}
//... la suite inchangée
Vous remarquez que :
- La génération des flux peut prendre en compte toutes combinaisons des paramètre tag, catégorie et langue.
- Pour l'instant seul les flux RSS de billet peuvent être générés en sélectionnant un tag.
- Il n'est toujours pas possible de sélectionner plusieurs catégories ou plusieurs tag pour générer un flux..
Commentaires
Excellent billet !
David LatapiePetite suggestion
OLD
"Pour l'ensemble de ces flux, il est possible de restreindre la génération aux seules informations disponible dans une langue donnée."
NEW
"Pour le quatre premiers flux, il est possible de restreindre la génération aux seules informations disponible dans une langue donnée."
DC 2 semble ne pas gérer Atom du tout (pas que ça me gêne). Le format 0.3 est de toute manière obsolète.
Je reviendrais sur les combinaisons. J'ai aussi dans les poches une ébauche de cahier des charges pour les tags, je poste dès que j'ai un peu le temps.
Petite suggestion > adoptée
Pour ATOM et RSS 2, je sais pas. Les spécifications techniques des flux RSS sont variables d'une source à l'autre. Encodage des caractères, item obligatoire ou facultatif, références externes ... c'est souvent un peu flou. Alors pour l'instant moi pour l'instant, je reste au RSS 1.0 +
Jérôme LauriolCommentaires J’ai appris que certains lisaient les commentaires récents. Je repasse donc à 10. J’ai d’ailleurs modifié le greffon LastComments. Retour du greffon de référencement Nombre de lectures Ajout du nombre de lecture, une...
Modifications du blog (Empyrée)Comme il est possible d’effectuer des RSS de catégorie (/rss.php?cat=urldelacategorie), est-il possible de s’abonner à un tag? Par exemple, au tag bug-report. Ça se pourrait bien : Je peux annoncer aux développeurs de plugins qu’ils ne...
RSS de tags (Empyrée)J'ai enfin mis en place les modifs proposées par Jérome pour avoir un flux RSS par tag sur ce blog. Par contre, j'ai procédé un peu différement. De son côté, il considère qu'un type de flux peut être soit billet, soit commentaires, soit
Flux RSS et tags (Alexandre Passant)Bonjour,
er:k]et pour ajouter le support des tags dans les flux RSS existants comment on peut faire ? J'ai commencé à regarder les code de rss.php mais je me suis rapidement noyé...:)
Jérôme, je n’ai toujours pas eu le temps de mettre les rss par tag sur mon carnet. J’ai regardé ton code et celui de mon RSS.php actuel en 1.2.4. Les différences sont un peu trop grandes pour que j’ose y toucher.
David LatapieVoici, grâce à l'excellent pastebin, la différence :
- ton code pastebin.com/716247
- mon code pastebin.com/716248
- celui d’Alexandre Passant, qui a ma préférence apassant.net/blog/2006/03...
Une idée sur le code à insérer ? Quid d’un greffon, serait-ce pertinent?
En fait de la version 1.2.3(celle dont je suis partie) à la version 1.2.4(l'actuelle), il n'y a que peu de changements. Les modifications décrites dans l'article peuvent être reportées sans grande difficulté.
Jérôme LauriolPour l'amélioration proposé par Alexandre, j'y suis favorable. En effet la sélection par tag n'introduit pas un nouveau type d'item. Mais je reparlerai de cela bientôt.
Pour le greffon/plugin, il faudrait que ceux-ci soit pris en compte en dehors du point l'accès principal (index.php). Le fichier rss.php ne gère pas l'appel aux plugins. Mais le sujet a déjà été abordé, avec Pep qui nous a traité pour l'occasion de 'zigoto'. J'espère apporter une solution prochainement à ce problème pour la branche 1.2.x de Dotclear. Ce sera pour moi l'occasion de refaire le zigoto avec un autre billet.
Si j'ai bien compris, ce système fonctionne uniquement avec les tags et pas avec le contenu des billets ? L'adaptation est-elle simple ?
pinchEn effet, l'objet de ce developpement est de pouvoir générer des flux RSS en selectionnant les informations à partir des tags définis par l'auteur via le plugin twTag. Le contenu des billets n'est pas analysé.
Depuis l'écriture de ce billet, je suis allé un peu plus loin, en proposant des flux où les informations peuvent être selectionnées par une combinaison de tags, de catégories, et d'auteurs.
L'ensemble de ces modifications décrites est relativement simple à mettre en place. Il faut quand même connaitre un minimum la syntaxe PHP, et agir avec méthode.
Jérôme