TUTORIEL PHP 
PHP : construire un wiki
La dernière application à la mode est aussi l'un des plus formidables outils de documentation collaborative. Le JDN Développeurs vous en présente sa version. (29/04/2004)

1. Intro | 2. L'objet Wiki
3. Les dernières fonctions

L'objet Wiki
Voici le début de notre objet wiki, avec son constructeur :

Class wiki
  {
  var $host;
  var $user;
  var $pass;
  var $base;
  var $tabl;

  var $date;
  var $titre;
  var $auteur;
  var $contenu;

  function wiki()
    {
    $this->host = 'localhost';
    $this->user = 'root';
    $this->pass = '';
    $this->base = 'test2';
    $this->tabl = 'jdnwiki';

    $this->titre = -1;
    $this->contenu = -1;
    $this->date = -1;
    $this->auteur = -1;

    $connexion = mysql_connect($this->host, $this->user, $this->pass);
    $db = mysql_select_db($this->base, $connexion) or die(mysql_error());
    }
(...)

Nous définissons les diverses variables de notre objet, et dans le constructeur leur assignons une valeur. Vous remarquerez que la connexion à la base est lancée à chaque instanciation de l'objet : ce n'est pas le plus efficace, mais nous ne cherchons pas ici l'optimisation...

Notre navigation n'est pas des plus optimisée : nous définissons trois états possibles par page : lecture, modification, sauvegarde. Etant donné que nous ne savons pas à l'avance si une page existe ou s'il faut la créer (selon les principes du Wiki), la lecture et la modification seront gérées par une même méthode, affichePage(), qui se chargera de trier le bon grain de l'ivraie. La sauvegarde sera elle gérée par la méthode sauverPage(). Nous définirons également une méthode chargePage() qui se chargera du coté SQL de la chose, et une autre wiki2html() qui appliquera quelques règles de WikiSpeech à nos pages (sans quoi elles seraient bien plates).
Les deux premières sont gérées par la méthode principale, affichage() :

function affichage()
  {
  if ( (isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'modif')
    && (isset($_REQUEST['titre']) && !empty($_REQUEST['titre']) )     )
    {
    $this->affichePage($_REQUEST['titre'], isset($_REQUEST['mode']));
    }
  elseif (isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'ecriture')
    {
    $this->sauverPage();
    }
  elseif (isset($_REQUEST['titre']) && !empty($_REQUEST['titre'])     )
    {
    $this->affichePage($_REQUEST['titre']);
    }
  else
    {
    $this->affichePage();
    }
  }

Voici le cheminement :
1) si un titre est spécifié et que le mode demandé est 'modif', nous donnons ces deux arguments à affichePage()
2) sinon, si le mode est écriture, nous sauvons l'état de l'objet avec sauvePage()
3) sinon, si nous n'avons qu'un titre, nous l'affichons
4) sinon (rien n'est donc demandé), nous appelons simplement affichePage().

affichePage() prendra en argument le titre de la page demandé, et le mode de visualisation. Les points 3) et 4) sont pris en charge par le fait que nous définissons des valeurs par défaut pour ces deux arguments : la page d'Accueil et le mode "lecture".
Ainsi, en déterminant si le mode n'est pas sur modif (donc une demande de modification) ou la date à "-1" (donc les variables objet n'est pas été créés), la fonction affiche soit la page normale, soit le formulaire d'éditons. Les deux états ont besoin de charger la page demandée à l'aide de chargePage().

function affichePage($titre='Accueil', $mode='lecture')
  {
  $this->chargePage($titre);

  if ( ($mode != 'modif') && !($this->date == -1) )
    {
    ?>
<form method="post" action="jdnwiki.php">
  <fieldset>
    <h2><?=$this->titre;?></h2>
    <?=$this->wiki2html($this->contenu);?>
    <hr />
    <i>(Dernière modification le <?=date("d/m/y à H:i:s",     $this->date);?> par <?=$this->auteur;?>)</i><br />
    <input type="hidden" name="titre" value="<?=$this->titre;?>" />
    <input type="hidden" name="date" value="<?=$this->date;?>" />
    <input type="hidden" name="auteur" value="<?=$this->auteur;?>" />
    <input type="hidden" name="mode" value="modif" />
    <input type="submit" value="Modifier cette page" />
  </fieldset>
</form>
    <?
    }
  else
    {
    $this->titre = $titre;
    $ti = (-1 == $this->titre) ? null : $this->titre;
    $ts = time();
    $ip = $_SERVER['REMOTE_ADDR'];
    $txt = (-1 == $this->contenu) ? null : $this->contenu;
    ?>
<form method="post" action="jdnwiki.php">
  <fieldset>
    <input type="hidden" name="titre" value="<?=$ti;?>" />
    <input type="hidden" name="date" value="<?=$ts;?>" />
    <input type="hidden" name="auteur" value="<?=$ip;?>" />
    <input type="hidden" name="mode" value="ecriture" />
    Vous êtes en train de modifier la page : "<?=$ti;?>"<br />
    <textarea name="contenu" cols="100" rows="20"><?=$txt;?></textarea><br />
    <input type="submit" value="Valider les modifications" />
  </fieldset>
</form>
    <?
    }
  }


  Forum

Réagissez dans les forums de JDN Développeurs

Notez que la conversion des textes est faite en directe avec wiki2html(), et l'IP de l'auteur est récupérée à l'aide de $_SERVER['REMOTE_ADDR'];. De son coté, la date est elle aussi transformée directement du Timestamp UNIX à un date normale avec date("d/m/y à H:i:s", $this->date). Le reste ne fait que remplir la page à l'aide des variables d'objet...

1. Intro | 2. L'objet Wiki
3. Les dernières fonctions

 

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page