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>";
}
|