TUTORIEL PHP 
Construire un Wiki (3) : comparer les versions
Suite et fin de notre programme de documentation collaborative, avec l'ajout d'une fonctionnalité d'affichage des différences entre deux états d'une page. (29/06/2004)

    1. Le final | 2. Description

Le final
Dernière étape de notre Wiki en PHP : l'affichage des différences entre deux versions d'une page.
Nous allons créer une fonction diff() prenant trois arguments : le nom de la page, et les id des deux états à comparer :

function diff($titre, $id1, $id2) { }

Pour y accéder, nous ajoutons un elseif() à notre fonction affichage() :

elseif ( (isset($_REQUEST['diff1']) && !empty($_REQUEST['diff1']) ) && (isset($_REQUEST['diff2']) && !empty($_REQUEST['diff2']) ) )
  {
  $this->diff($_REQUEST['titre'], $_REQUEST['diff1'],   $_REQUEST['diff2']);
  }

Si l'URL contient deux arguments diff1 et diff2, on les renvoie vers la méthode $this->diff(), qui se charge d'afficher les différences.

Cet URL est créé par la page d'historique, évidemment, car c'est elle qui affiche l'ensemble des versions précédentes. Nous la modifions donc pour intégrer un lien HTML renvoyant le bon URL. Parce que nous sommes obligés de travailler dans les limites de notre méthode afficheHist() - et que nous ne la modifierons pas plus qu'il ne faut - nous ne pouvons comparer les anciennes pages qu'à la dernière en date, et non comparer les pages entre elles de manière arbitraire. Reprendre plus largement la méthode permettrait certainement d'accomplir cela, mais nous en restons là pour l'heure. Les changements sont indiqués en gras :

function afficheHist($page)
  {
  echo "<br /><br /><fieldset><legend>Historique de la page '<a href=\"?titre=$page\">$page</a>'<br></legend><br />";
  $sql = "SELECT * FROM $this->tabl WHERE titre='$page' ORDER BY date DESC;";
  $rsql = mysql_query($sql);

  if (mysql_num_rows($rsql) == 0)
    {
    $this->date = -1;
    }
  else
    {
    $version = $vers = mysql_affected_rows();
    while ($row = mysql_fetch_object($rsql))
      {
      $txt = "<a href='?titre=$page&id=$row->id'>Version $version</a> datant du ";
      $txt .= date("d/m/y à H:i:s", $row->date);
      $txt .= " par <i>$row->auteur</i>";

      if ($version!=$vers)
        {
        $txt .= " (<a href='?titre=$page&diff1=$row->id&diff2=$latest'>diff</a>)";
        }
      else
        {
        $latest = $row->id;
        }
      $txt .= "<br/>\n";
      echo $txt;
      $version--;

      }
    }
  echo "<br /></fieldset>";
  }

Enfin, notre méthode diff() :

function diff($page, $id1, $id2)
  {
  echo "<br /><br /><fieldset><legend>Différences pour '<a href=\"?titre=$page\">$page</a>'<br></legend><br />";

  $this->chargerPage($page, $id1);
  $contenu1 = htmlspecialchars($this->contenu);
  $explode1 = explode("\n", $contenu1);
  $this->chargerPage($page, $id2);
  $contenu2 = $this->contenu;
  $explode2 = explode("\n", $contenu2);

  $compte1 = count($explode1);
  $compte2 = count($explode2);
  if ($compte1 < $compte2)
    {
    $comptebase = $compte2;
    $manquant = $compte2-$compte1;
    for ($i=0;$i<$manquant;$i++)
      {
      array_push($explode1, "");
      }
    }
  elseif ($compte2 < $compte1)
    {
    $comptebase = $compte1;
    $manquant = $compte1-$compte2;
    for ($i=0;$i<$manquant;$i++)
      {
      array_push($explode2, "");
      }
    }
  else { $comptebase = $compte1; }

  echo "<fieldset><legend>Effacé entre la nouvelle et l'ancienne version :</legend>";

  $texte = "";
  for ($i=0; $i<$comptebase; $i++)
    {
    $exp = explode(" ", $explode1[$i]);
    $exl = explode(" ", $explode2[$i]);
    foreach ($exp as $clep => $motp)
      {
      $motp = str_replace("/", "\/", $motp);
      $motp = str_replace("[", "\[", $motp);

      if (preg_grep("/(\[)?(http:\/\/)?".$motp."(\])?/i", $exl))
        {
        $texte .= $motp." ";
        }
      else
        {
        $texte .= "<del>".$motp."</del> ";
        }
      }
    }
  $texte = str_replace("\/", "/", $texte);
  $texte = str_replace("\[", "[", $texte);
  echo nl2br($this->wiki2html($texte));

  echo "</fieldset><br>";
  echo "<fieldset><legend>Ajouté entre la nouvelle et l'ancienne version</legend>";
  $texte = "";
  for ($i=0; $i<$comptebase; $i++)
    {
    $exp = explode(" ", $explode1[$i]);
    $exl = explode(" ", $explode2[$i]);
    foreach ($exl as $clel => $motl)
      {
      $motl = str_replace("/", "\/", $motl);
      $motl = str_replace("[", "\[", $motl);

      if (preg_grep("/".$motl."/i", $explode1))
        {
        $texte .= $motl." ";
        }
      else
        {
        $texte .= "<b>".$motl."</b> ";
        }
      }
    }
  $texte = str_replace("\/", "/", $texte);
  $texte = str_replace("\[", "[", $texte);
  echo nl2br($this->wiki2html($texte));

  echo "</fieldset>";

  echo "</fieldset>";
  }

    1. Le final | 2. Description

 

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





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages