Changements récents par catégorie
La liste des pages récemment modifiées peut être fastidieuse à parcourir pour qui ne vient pas régulièrement sur le Wiki. Cette liste génère également beacoup de bruit pour qui n'est intéressé que par un seul sujet du wiki.
Je pense qu'il existe un besoin pour réduire l'affichage des derniers changements à une catégorie de page : une espèce de mix entre "backlinks" et "recentchanges". Il devrait être possible de ne lister que les changements récents des pages ayant un lien vers une autre page ; on pourrait par exemple avoir :
- les derniers changements concernant la documentation de wikini
- les derniers changements concernant les pages des utilisateurs
- les derniers changements concernant le service DirectionCommerciale?
Il devient donc plus facile de faire vivre plusieurs communautés d'utilisateurs et/ou de sujets sur un même wiki.
On pourrait donc avoir un paramètre supplémentaire dans cet esprit :
{{RecentChanges category="DirectionCommerciale"}}
Qu'en pensez-vous ? Je pense que la mise en oeuvre n'est pas très complexe. (Si l'un d'entre vous veut se lancer, faut pas hésiter ; je manque un peu de temps ces derniers temps.)
--
CharlesNepote
J'ai testé le petit code suivant qui focntionne bien.
/action/recentchanges3.php
<?php
//
$category = $this->GetParameter("category");
$pages = $this->LoadAll("select p.tag, p.time, p.user, p.owner ".
"from ".$this->config["table_prefix"]."pages p, ".$this->config["table_prefix"]."links l ".
"where p.latest = 'Y' and p.comment_on = '' and p.tag = l.from_tag and to_tag = '".mysql_escape_string($category)."'order by time desc");
foreach ($pages as $i => $page)
{
// echo entry
echo "(",$page["time"],") (",$this->ComposeLinkToPage($page["tag"], "revisions", "historique", 0),") ",$this->ComposeLinkToPage($page["tag"], "", "", 0)," . . . . ",$this->Format($page["user"]),"<br />\n" ;
}
?>
Je vais l'améliorer progressivement...
--
CharlesNepote
Changements récents en excluant une catégorie
Encore plus fort, il peut être très intéressant d'afficher les changements récents en excluant une ou plusieurs catégories. Exemples d'applications :
- pour des utilisateurs débutants, je veux afficher les changements récents de mon site sauf les changements concernant les pages relatives aux UtilisateurConfirme
- pour des utilisateurs non techniciens, je veux afficher les changements récents de mon site sauf les changements concernant les pages liées à PageDeveloppeur
- pour des utilisateurs n'intervenant pas dans mon projet xy, je veux sortir des changements récents ceux liés à notre activité interne, marqué par la catégorie ActiviteInterne
- pour l'utilisateur final, je souhaite lui communiquer les changements récents affectant uniquement les pages considérées comme publiables et non les pages catégorisées comme BrouillonACompleter
- je souhaite que l'utilisateur public ne puisse pas voir les derniers changements des pages privées de mon site, ces dernières étant taguées par la mention PagePrivee
Avantages fonctionnels :
- permet de cibler les changements récents en fonction du public que l'on souhaite toucher
- permet de fabriquer plusieurs pages de changements récents avec des valeurs ajoutées différentes
- permet de gagner du temps pour l'utilisateur final qui ne voit que ce qui l'intéresse a priori
Inconvénients fonctionnels :
- l'habitué des wikis, croyant voir des "derniers changements" classiques, n'est pas au courant d'une partie des changements du site
- un animateur du wiki peut sans le savoir, manquer des pages qui auraient pu être vandalisées
Il me paraît donc important, comme les derniers changements par catégorie, d'indiquer à l'utilisateur que ces derniers changements ne reflètent pas tous les derniers changements du site.
--
CharlesNepote
Changements agrégés
On peut aller encore plus loin en intégrant des flux externes via des fils RSS : on peut agréger les changements récents de plusieurs wikis relativement à un sujet particulier. La mise en oeuvre est cependant plus complexe.
--
CharlesNepote
Ce qui se fait ailleurs
J'ai apporté plusieurs modifications à cette action pour répondre à certains de nos besoins.
Voici par exemple ce que nous mettons sur notre page d'accueil :
Ce qui donne ceci :
Les 5
dernières pages éditées :
SSH,
AlDo,
ProjetLDAP,
NeNiameyCnf,
AstucesScreen.
Les 5
pages les plus visitées :
ListeDesLogiciels,
ModelePareFeu,
ListeDesConfigurations,
AuFMessagerie,
ListeDesModeles.
Les 5 derniers
utilisateurs créés :
AlDo,
DarkoStanar,
EricDane,
FritsDouma,
MathieuGiannecchini?.
Le paramètre "separator" permet d'affiche une liste d'éléments de manière linéaire.
Le paramètre "notorphaned" permet d'exclure les pages orphelines de la requête.
Le paramètre "exclude" permet d'exclure certaines pages de la requête (dès le SELECT).
Tout ceci à bien entendu demandé quelques modifications (assez légères et compatibles) du fichier
wakka.php.
--
ProgFou
Je trouve tes options "separator" et "exclude" très intéressantes (vite : le source ;) ; je suis plus mitigé sur le paramètre "notorphaned". A quoi t sert ce dernier ?
--
CharlesNepote
Pour le "notorphaned", en fait je pense qu'on en a plus besoin à présent... C'était surtout dû au fait qu'on ne voulait pas exclure un certain nombre de pages et qu'il se trouvaient que la plupart étaient orphelines. Maintenant que j'ai implémenté une exclusion efficace avec possibilité d'utiliser LIKE/%, on en a sans doute plus besoin... Je vais vérifier à l'occasion. (sources à venir rapidement, il faut juste que je nettoie un peu le bruit des autres modifications autour... ;-))
--
ProgFou
Concernant le paramètre "exclude", au niveau de l'action
{{RecentChanges}} le changement est très simple : ajouter le paramètre
exclude au chargement des pages avec
LoadRecentlyChanged($max, $this->GetParameter($exclude)). La définition de la fonction
LoadRecentlyChanged change alors comme suit :
<?php
function LoadRecentlyChanged($limit=50, $exclude="") {
$limit= (int) $limit;
if ($pages = $this->LoadAll("select tag, time, user, owner from ".$this->config["table_prefix"]."pages where latest = 'Y' and comment_on = ''".$this->QueryMakeExclude($exclude)." order by time desc limit $limit"))
{
foreach ($pages as $page)
{
$this->CachePage($page);
}
return $pages;
}
}
function QueryMakeExclude($exclude, $field="tag")
{
if (!$exclude) return "";
$tags = explode(";", $exclude);
foreach ($tags as $key => $tag)
{
$tags[$key] = $field." NOT LIKE '".mysql_escape_string($tags[$key])."'";
}
return " AND (".implode(" and ", $tags).")";
}
?>
Au passage, je suis un peu perturbé par le fait que les pages soient "cachées" alors qu'elles ne sont pas "pleinement" chargées : on n'en récupère pas ici toutes les colonnes utiles. Je sens un bug à venir...
--
ProgFou
Concernant le paramètre "separator", j'ai incrusté le bout de code suivant juste après le
LoadRecentlyChanged :
<?php
if ($this->GetParameter("separator"))
{
$separator = $this->GetParameter("separator");
foreach ($pages as $i => $page)
{
// echo separator before each entry,
// except before the first one (index 0)
if ($i != 0) { echo $separator; }
// echo entry
echo $this->ComposeLinkToPage($page["tag"], "", "", 0);
}
}
else
if ($this->GetParameter("max"))
...
?>
--
ProgFou
Je pense qu'on peut "voir un peu plus grand" pour le paramètre "exclude", cf.
FonctionDeSelectionDePage. --
CharlesNepote
Très surprenant comme action :
- En tant qu'utilisateur, quand je cherche les derniers changements, je suis intéressé par les changements intervenus aujourd'hui, hier, depuis telle date, telle heure. Or, ce paramètre n'est pas pris en compte ici.
- En tant qu'utilisateur, quand je cherche les derniers changements, je suis intéressé par les changements intervenus sur cette page : j'aimerais que, lisant cette page, le lecteur puisse connaître immédiatement-sans manipulation la date des derniers changements, puis ceux-ci. Or, ce paramètre n'est pas pris en compte ici. -- (page, utilisateur ) 2004/05/20 - 09 : 41 -- FidelioEspoir