Cette page est destinée aux développeurs découvrant WikiNi et désirant ajouter des fonctionnalitées à WikiNi. Elle nécessite une connaissance correcte de php et des notions de programmation objet en php.
Présentation
WikiNi possède deux types de greffons ("plugin") :
- les "actions" qui servent à l'utilisateur final pour générer automatiquement du contenu à l'intérieur de la zone de contenu d'une page WikiNi (cf. la ListeDesActionsWikiNi)
- les "handlers" qui batissent une forme particulière d'une page : mode affichage ("show" ; c'est le mode par défaut), mode édition, sortie brute ("raw"), affichage des différentes versions d'une page ("diff"), etc. (cf. la ListeDesHandlersWikini)
Nous parlons ici des "handlers".
Un handler est spécifié par l'interface utilisateur, sous la forme d'un appel à une URL particulière. L'appel à un handler est toujours le même :
http://mon-site.org/wakka.php?wiki=UnePage/nom_du_handler
Le handler peut contenir des paramètres optionnels, passés soit avec la méthode GET soit avec la méthode POST.
Installation
- Pour WikiNi version 0.1.1.0.3 et antérieurs :
- appel aux handler à effectuer dans wakka.php [à détailler] :
- Ouvrez le fichier wakka.php qui se trouve dans le répertoire racine de WikiNi
- Allez vous placer sur la fonction Run et repérez le code suivant :
switch ($this->method)
{
case "xml":
header("Content-type: text/xml");
case "raw":
print($this->Method($this->method));
break;
default:
print($this->Header().$this->Method($this->method).$this->Footer());
}
- Il faut éventuellement modifier ce switch pour ajouter votre handler. Les cas où vous devrez modifier ce switch seront lorsque vous devez modifier l'entête HTTP ( fonction header de php) ou afficher une page avec un aspect complètement différent de l'aspect WikiNi. Par défaut, votre handler est affiché comme une page normale, donc avec l'entête et le pied de page WikiNi.
- Un exemple où il faudrait modifier ce code serait si vous voulez générer le contenu de la page au format PDF. L'entête HTTP devra contenir un Content-type indiquant que c'est du PDF qui est envoyé (Content-type: application/pdf ?).
- placer le fichier php du handler dans le répertoire /handler/page
- Pour WikiNi version 0.4.x :
- à partir de cette version les handlers sont modulaires ; il suffit donc de placer le fichier php du handler dans le répertoire /handler/page.
Le nom d'appel du handler est le nom du fichier le définissant sans l'extension .php. Par exemple, le handler edit.php est appelé de cette manière :
http://mon-site.org/wakka.php?wiki=UnePage/edit
Comment ça marche ?
Lorsque l'utilisateur fait appel à un handler, il appelle le handler comme une méthode particulière de la classe "wiki". Le code du handler devient donc une partie du code de la classe Wiki et peut donc accéder à ses méthodes en utilisant la variable $this.
Écriture d'un handler pour WikiNi 0.4.1 et supérieurs
1. Ajouter un contrôle vérifiant que le handler n'est pas appelé en direct, sans passer par wakka.php.
if (!defined("WIKINI_VERSION"))
{
- die ("accès direct interdit");
}
1b. Ajouter si besoin, les en-têtes HTTP nécessaires au type de données en sortie.
Par exemple, si vous écrivez un handler générant un flux RDF, il faut ajouter le header correspondant pour que le navigateur reconnaisse le bon type-mime du document : header("Content-type: text/xml");
1c. Si handler est relatif à la page en cours, tester si l'utilisateur a bien le droit de consulter ces données
if (!$this->HasAccess?("read")) { return; }
2. Codez vos traitements
On verra des exemples ci-dessous.
Exemple de handler permettant d'afficher le nom de la page :
<?php
/*
Exemple de handler exemple.php pour WikiNi version WikiNi 0.4.x.
Développé par Charles Népote.
Version 0.02 du 03/07/2004.
Licence GPL.
*/
// On teste si le script n'est pas appelé en direct
if (!defined("WIKINI_VERSION"))
{
die ("accès direct interdit");
}
// On teste si l'utilisateur peut lire la page
if (!$this->HasAccess("read"))
{
return;
}
else
{
// On teste si la page existe
if (!$this->page)
{
return;
}
else
{
// Affiche l'en-tête
echo
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n",
"<html>\n\n\n",
"<head>\n",
"<title>", $this->GetWakkaName(), ":", $this->GetPageTag(), "</title>\n",
"<style type=\"text/css\" media=\"all\"> @import \"../style/wakka.css\";</style>\n",
"</head>\n\n\n";
// Affiche le corps de la page
echo
"<body>\n",
$this->GetPageTag(),
"</body>\n",
"</html>";
}
}
?>
Une autre version du même code, en plus court :
<?php
/*
Exemple de handler exemple.php pour WikiNi version WikiNi 0.4.x.
Développé par Charles Népote.
Version 0.02 du 03/07/2004.
Licence GPL.
*/
// On teste si le script n'est pas appelé en direct
if (!defined("WIKINI_VERSION"))
{
die ("accès direct interdit");
}
// On teste si l'utilisateur peut lire la page
if (!$this->HasAccess("read"))
{
return;
}
else
{
// On teste si la page existe
if (!$this->page)
{
return;
}
else
{
// Affiche l'en-tête
echo $this->Header();
//Utilisation de la classe CSS de mise en forme des pages
echo "<div class=\"page\">";
//affiche le nom de la page
echo $this->GetPageTag();
//affiche le pied de page complet
echo "</div>";
echo $this->Footer();
}
}
?>
Conclusion
Ecrire un handler n'est pas très difficile dans le principe, la difficulté dépend de ce que fait le handler. Si vous voulez écrire vos propres handlers, n'hésitez pas à lire le code source des handlers déjà écrit (cf. les handlers de wikini 0.4.1 : http://cvs.gna.org/viewcvs/wikini/wikini/handlers/page/?only_with_tag=REL_0_4_1 )