• Facile
Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Introduction du cours

Bienvenue à tous dans ce tutoriel. :)

Au cours de celui-ci, je vais vous apprendre à créer un système de pages « wiki » (pages éditables par tout le monde) incluant bon nombre de fonctionnalités agréables.

Sachez que tout repose sur les fichiers ; nous n'avons pas besoin de base de données. Cet aspect facilite grandement la portabilité du code, notamment dans le cas où vous souhaitez le partager avec des amis. ;)

Niveau :6/10 - Intermédiaire.

Un système qui fonctionne avec les fichiers ?

Dans un premier temps, je vais vous décrire précisément le fonctionnement des scripts, et ce que je n'inclurai pas dans le tutoriel.

Comme dit dans l'introduction, nous n'utiliserons pas de base de données. Il s'agit d'un plus sur certains points, mais cela peut aussi compliquer la tâche du codeur.

L'atout principal des fichiers est qu'ils garantissent une bonne organisation grâce à la création de sous-dossiers. :)

Le problème des fichiers

Je dois vous avertir : l'utilisation des fichiers implique un souci de taille. En effet, il faut assigner certains droits au script pour qu'il puisse créer des fichiers.

Lorsque nous aurons créé les fichiers, il faudra donc que vous changiez leur CHMOD, en particulier pour les pages amenées à créer ou modifier des fichiers. ;)

Le fonctionnement

Je vais vous décrire plus en détail le fonctionnement des scripts.

Nous allons tout d'abord créer un dossier nommé lib, qui contiendra toutes les fonctions qui seront utilisées.

Ensuite, nous créerons trois pages différentes :

  • view.php (à la racine, et non dans le dossier lib), qui s'occupera d'afficher la page ;

  • edit.php, qui servira à la modification d'une page ;

  • restauration.php, qui en permettra la restauration (comme l'indique le nom du fichier ! :-° ).

Euh... restauration de la page ? Que veux-tu dire par là ?

Concrètement, à chaque modification (dont la création) d'une page, une sauvegarde sera créée. L'énorme avantage consiste, si un internaute mal intentionné efface la totalité du contenu, à pouvoir en deux clics restaurer la page telle qu'elle était avant ! :)

Enfin, la dernière page, index.php, s'occupera d'afficher la liste des pages créées.

Je ne parlerai pas...

Dans ce mini-tuto, je n'évoquerai volontairement pas toutes les fonctions existantes en matière de wiki.
On peut déjà citer la possibilité de diviser une page en plusieurs parties (tel un tutoriel sur le SdZ) ; c'est faisable, mais relativement difficile avec les fichiers.

Ensuite, la mise à la corbeille. Beaucoup d'entre vous connaissent certainement l'interface ZAP, développée par bluestorm.
Cette interface intègre notamment la fonction servant à supprimer mettre à la poubelle un document (tutoriel, news, etc.). Il s'agit d'une fonctionnalité essentielle permettant de virer de la liste les documents inutiles. :)

Je suis désolé, mais j'ai dû faire ce choix afin de ne pas écrire un tutoriel de trente pages qui ennuierait le lecteur...

Enfin, une chose que beaucoup aimeraient pouvoir créer (mais qui ne sera pas présentée dans ce tutoriel) : une interface permettant l'insertion de balises comme le zCode.
Une fois de plus, ce choix est justifié, un tutoriel très bien réalisé (par madmac) existant déjà : Parser du XML - L'exemple du zCode.

Voilà, j'espère n'avoir pas déçu trop de monde. Cela dit, rassurez-vous, ce que je vais vous apprendre sera pour vous une excellente base. Libre à vous de rajouter par la suite pleins de fonctions superflues ! :p

La page d'accueil

Concevons la page d'accueil.

Dans un premier temps, nous allons créer dans le dossier lib un fichier intitulé liste_pages.php.
Il est censé contenir la fonction qui permet de lister toutes les pages existantes. :)

Tout d'abord, déclarons la fonction et une variable utile :

<?php
 
function liste_pages()
        {
        GLOBAL $donnees; // Cette variable sera renseignée à la fin du script
        $repertoire = "pages";
?>

Comme vous pouvez le constater, il n'y a rien de bien compliqué à cela.

Maintenant, nous allons récupérer tous les dossiers du répertoire pages (vous devez créer ce dossier ;) ) :

<?php
$dossiers = glob($repertoire.'/*');
asort($dossiers); // On classe les noms de dossiers afin qu'ils soient affichés par ordre alphabétique / croissant
?>

Nous allons déclarer trois variables, dont deux tableaux.
Le premier tableau contiendra les noms des pages, le deuxième leur id (identifiant) et la troisième variable sera un compteur pour le foreach qui suit. ;)

<?php
$noms = array();
$ids = array();
$compteur = 0;
?>

Nous pouvons maintenant ajouter le foreach qui va placer le nom et l'id de la page dans les deux tableaux que nous avons créés précédemment. :)

<?php
foreach($dossiers as $adresse) // On va lister tout ça
                {
                if(is_dir($adresse)) // On vérifie qu'il s'agit bien d'un dossier que l'on traite, et non un fichier !
                        {
                        $id = explode('/', $adresse);
                        $ids[$compteur] = $id[1]; // Nom du dossier = id de la page :)
                        
                        $ouverture_titre = fopen($adresse.'/titre.txt', 'r'); // On ouvre le fichier contenant le titre de la page
                        $lecture_titre = fread($ouverture_titre, filesize($adresse.'/titre.txt')); // On lit le fichier - filesize retourne la taille du fichier :)
                        
                        $noms[$compteur] = $lecture_titre; // On met le titre dans le tableau qui contient les titres des pages 
                        
                        $compteur++; // On incrémente le compteur
                        }
                }
?>

Vous souvenez-vous que j'ai déclaré comme « globale » la variable $donnees ? Eh bien, nous allons la renseigner ; elle va contenir un tableau :

<?php
$donnees = array('Noms' => $noms, 'Id' => $ids);
?>

Voilà ! Nous disposons à présent de notre fichier liste_pages.php, qui contient la fonction pour lister les pages.
Il ne nous reste plus qu'à afficher tout cela sur la page index.php :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Accueil du Wiki</title>
</head>
<body>
<p>
<?php
 
require('lib/liste_pages.php');
 
// On va lister les pages !
 
liste_pages();
 
$compteur = 0;
foreach($donnees['Noms'] as $nom) // On explore le tableau
        {
        echo '<a href="view.php?id='.$donnees['Id'][$compteur].'">'.$nom.'</a> [<a href="edit.php?id='.$donnees['Id'][$compteur].'">Editer</a>]<br />'; // On affiche le nom avec un lien pour l'édition
        $compteur++;
        }
echo '<br /><a href="creer.php">Créer une page</a><br />';
 
?>
</p>
</body>
</html>

La page d'accueil est maintenant terminée. :) Au passage, vous remarquerez que tous les liens visibles sur cette page ne vous sont pas très utiles ; on va régler cela dans les parties suivantes. ;)

Créer et modifier une page

Bon, on va enfin pouvoir attaquer les pages les plus importantes. :)

Dans un premier temps, on va élaborer la page creer.php, qui aura pour but de créer une page.
Ensuite, ce sera au tour de edit.php, qui permettra d'en modifier.

Créer une page

Encore une fois, on va créer une page qui appellera le fichier creer_page.php (qui se trouve dans le dossier lib). ;)
Si je sépare les fichiers comme cela, c'est pour que la modification des scripts soit plus aisée : ainsi, on ne se retrouve pas avec des fichiers de 300 lignes. :p

Commençons par déclarer la fonction :

<?php
function creer_page($type, $titre, $contenu)
        {
        GLOBAL $id_a_creer;
?>

Pour information, sachez ceci :
$type contiendra normal ou protege. Si la valeur est protege, on concevra un système pour bloquer l'édition de la page. :)
$id_a_creer contiendra l'id de la page créée. ;)

Maintenant, on va utiliser la fonction glob(), qui dresse dans un tableau la liste des fichiers et dossiers du répertoire passé en paramètre. :)

<?php
$liste_dossiers = glob($repertoire.'/*'); // On va lister tous les dossiers, en sachant que le nom du dossier == l'id de la page
        
        $ids; // Cette variable contiendra les id de toutes les pages
        $compteur = 0; // Compteur qui servira au foreach 
?>

Nous pouvons maintenant démarrer le foreach, afin qu'il nous trouve l'id de la dernière page créée. La méthode employée est très simple ; je vous laisse regarder :

<?php
       foreach($liste_dossiers as $nom)
                {
                if(is_dir($nom))
                        {
                        $id = explode('/', $nom); // On va séparer les parties de $nom pour avoir la dernière : l'id du dossier
                        $ids[$compteur] = $id[1]; // On stocke l'id dans le tableau
                        $compteur++;
                        }
                }
        $id_a_creer = max($ids); // Grâce à la fonction max, on récupère le plus grand id du tableau
?>

À présent, on va augmenter de 1 la variable $id_a_creer, pour qu'elle contienne le nouvel id.
Ensuite, nous allons créer le dossier qui aura pour nom cet id, et déclarer la variable $repertoire qui va nous servir pour toutes les actions sur les fichiers qui suivront. :)

<?php
        $id_a_creer++;
        
        $creer_dossier = mkdir($repertoire.'/'.$id_a_creer); // On crée le dossier
        $repertoire = $repertoire.'/'.$id_a_creer;
?>

Si $type (pour rappel, il s'agit de l'un des paramètres de la fonction) est égal à protege, on crée un fichier de plus :

<?php
if($type == "protege")
                {
                $creer_fichier_protect = fopen($repertoire.'/protect', 'w+');
                fclose($creer_fichier_protect);
                }
?>

Ce fichier sera vide, mais il va exister, et il suffira de vérifier si ce fichier existe pour savoir si l'édition est interdite ou non. ;)

Rien de bien compliqué. :) Petit rappel à propos de fopen : il faut lui indiquer comment ouvrir le fichier (lecture, écriture, etc.). Toutes ces façons d'ouvrir le fichier sont disponibles ici : DOC PHP.
Dans notre cas, le moyen utilisé est « en écriture, on crée le fichier s'il n'existe pas » (= w+).

À présent, on va créer les fichiers qui contiendront le titre et le contenu :

<?php
        file_put_contents($repertoire.'/titre.txt', $titre); // On écrit le titre dans le fichier
        
        file_put_contents($repertoire.'/contenu.txt', $contenu); // On inscrit le contenu dans le fichier
?>

Il nous reste une dernière étape à effectuer ; elle concerne l'historique de la page : dans ce cas-ci, il faut sauvegarder à un autre endroit le titre et le contenu pour qu'il soit possible, après une modification non désirée, de remettre cette version à la place de celle qui est en ligne. ;)

<?php
        ######################################################
        ## Partie pour les sauvegardes, pour la restauration ##
        ######################################################
        
        $timestamp_actuel = time(); // On récupère le timestamp actuel pour dater la sauvegarde
        $creer_dossier_sav = mkdir($repertoire.'/save'); // On crée le dossier qui va contenir toutes les sauvegardes de la page
        $creer_dossier_time = mkdir($repertoire.'/save/'.$timestamp_actuel); // On crée le dossier qui va contenir le titre et le contenu pour pouvoir restaurer après !
        
        $repertoire = $repertoire.'/save/'.$timestamp_actuel; // On change le répertoire de traitement
        
        ## Même étape que précédemment
        
        file_put_contents($repertoire.'/titre.txt', $titre);
        file_put_contents($repertoire.'/contenu.txt', $contenu);
 
        
        #############################################
        ## Fin de la partie pour les restaurations ##
        #############################################
?>

Et voilà ! :)

Il faut maintenant que l'on constitue la page creer.php (ne se trouvant pas dans le dossier lib) qui affichera le formulaire. ;)

Étant donné que le code est très simple, j'ai jugé inutile de vous en détailler le contenu. Le voici :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Wiki</title>
</head>
<body>
<?php
if(!empty($_POST['titre']) && !empty($_POST['contenu'])) // Si le formulaire a été validé et qu'il n'est pas vide
        {
        $titre = htmlspecialchars($_POST['titre']); // La variable contenant le titre
        $contenu = nl2br(htmlspecialchars($_POST['contenu'])); // Le contenu
        
        require('lib/creer_page.php'); // On récupère la fonction pour créer la page
        
        if(isset($_POST['1'])) // Si on crée la page normalement
        creer_page('normal', $titre, $contenu); // On appelle la fonction pour créer la page
        if(isset($_POST['2'])) // Si on veut rendre l'édition impossible
        creer_page('protege', $titre, $contenu); // On appelle la fonction pour créer la page
        
        echo 'Votre page a bien été créée !<br />
        Vous pouvez la voir ici : <a href="view.php?id='.$id_a_creer.'">voir ma page</a>.';
        }
else // on n'a pas validé le formulaire, alors on l'affiche !
        {
        echo '<form method="post" action="creer.php">
        <p><label for="titre">Titre de votre page : </label><br />
        <input type="text" name="titre" id="titre" /><br />
        <label for="contenu">Contenu de votre page : </label><br />
        <textarea name="contenu" id="contenu" cols="100" rows="10"></textarea><br />
        <input type="submit" name="1" value="Créer ma page !" /><input type="submit" name="2" value="Créer et rendre impossible l\'édition" /></p></form>';
        }
?>
</body>
</html>

Voilà : vous avez maintenant vos deux pages et pouvez en créer. :) Essayez d'en créer deux, et rendez-vous sur la page d'accueil : magique, deux titres s'affichent !

Modification de la page

On associe souvent le mot « ajouter » à « modifier », et c'est ce qui est fait dans ce tutoriel.
Voyons un peu en quoi consistent les deux pages nécessaires à la modification d'un article. :)

La première se nomme modifier_page.php et se trouve dans le dossier lib (le fichier contient une fonction ;) ).

On commence par déclarer la fonction :

<?php
function modifier_page($id, $titre = NULL, $contenu = NULL)
        {
        $repertoire = 'pages/'.$id;
?>

Je ne vais pas trop vous détailler le code suivant ; vous la comprendrez mieux lorsque je vous montrerai la deuxième page. :)

<?php
        if($titre != NULL) // Si on veut modifier le titre
                {
                file_put_contents($repertoire.'/titre.txt', $titre); // On écrit le titre dans le fichier
                }
        if($contenu != NULL) // Si on veut modifier le contenu
                {
                file_put_contents($repertoire.'/contenu.txt', $contenu); // On met le contenu dans le fichier
                }
?>

Il ne nous reste plus qu'à nous occuper du système d'historique : nous allons créer un dossier (il aura pour nom le timestamp actuel lors de la modification) qui contiendra le titre et le contenu de la page après modification. ;)

<?php
        ## PARTIE POUR LES SAUVEGARDES
        $timestamp_actuel = time(); // Timestamp actuel
                
        $creer_dossier_time = mkdir($repertoire.'/save/'.$timestamp_actuel); // On crée le répertoire qui aura pour nom le timestamp actuel
        
        file_put_contents($repertoire.'/save/'.$timestamp_actuel.'/titre.txt', $titre); // On crée le fichier et on écrit le titre
 
        file_put_contents($repertoire.'/save/'.$timestamp_actuel.'/contenu.txt', $contenu); // Création du fichier + écriture du contenu
        
        ## FIN PARTIE POUR LES SAUVEGARDES
?>

Ouf, fini pour cette page. :)
Afin d'achever proprement la partie « modification » (il serait bête de ne pouvoir utiliser la fonction ci-dessus), nous allons construire une page edit.php, qui s'occupera du formulaire et du reste. :)

Bon, voici déjà les premières lignes du code :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Édition d'une page</title>
</head>
<body>
<?php
 
require('lib/voir_page.php'); // On a aussi besoin de cette fonction pour connaître le titre et le contenu de la page
require('lib/modifier_page.php');
 
if(!isset($_GET['id'])) // Si on n'a pas l'id de la page demandée
        {
        echo 'Vous devez fournir l\'id de la page !<br />'; // Message d'erreur
        exit; // On arrête le script
        }
?>

Ces lignes sont indispensables pour que le reste du script fonctionne. ;)

Plus haut, je vous disais que vous comprendriez les lignes du code plus tard. Ce « plus tard » est arrivé, et voici le code qui correspond :

<?php
if(!empty($_POST['titre']) && !empty($_POST['contenu'])) // Si le formulaire n'est pas vide
        {
        if($_POST['titre'] != $_POST['titre_old'])
                {
                $modif_titre = htmlspecialchars($_POST['titre']);
                }
        else
                {
                $modif_titre = NULL;
                }
        if($_POST['contenu'] != $_POST['contenu_old'])
                {
                $modif_contenu = nl2br(htmlspecialchars($_POST['contenu']));
                }
        else
                {
                $modif_contenu = NULL;
                }
        if(!file_exists('pages/'.intval($_GET['id']).'/protect')) // Si l'édition n'est pas protégée
        {
                modifier_page(intval($_GET['id']), $modif_titre, $modif_contenu);
        }
        else //Si elle l'est
        {
                echo 'L\'édition est interdite !';
                exit;
        }
        
        echo 'Page modifiée !<br />
        <a href="view.php?id='.$_GET['id'].'">Voir la page</a>';
        }
?>

Il reste à afficher le formulaire ; vous pourrez le modifier par la suite, bien entendu. :p

<?php
else // S'il n'a pas été posté
        {
        if(file_exists('pages/'.intval($_GET['id']).'/protect')) // Si l'édition n'est pas protégée
        {
        echo 'L\'édition est interdite !';
        exit;
        }
        affiche_page(intval($_GET['id']));
        $donnees['Contenu'] = str_replace('<br />', '', $donnees['Contenu']);
        echo '<form method="post" action="edit.php?id='.$_GET['id'].'">
        <p><label for="titre">Titre de la page : </label><br />
        <input type="text" name="titre" id="titre" value="'.$donnees['Titre'].'" />
        <input type="hidden" name="titre_old" value="'.$donnees['Titre'].'" /><br />
        <label for="contenu">Contenu de la page : </label><br />
        <textarea name="contenu" id="contenu" rows="10" cols="100">'.$donnees['Contenu'].'</textarea>
        <input type="hidden" name="contenu_old" value="'.$donnees['Contenu'].'" /><br />
        <input type="submit" value="Modifier la page" /></p></form>';
        }
?>
</body>
</html>

Bon, ben... c'est tout pour les actions sur les pages !
Au cours de la partie suivante, vous allez enfin pouvoir afficher les belles pages que vous avez créées. :)

Afficher une page

Nous avons pratiquement terminé notre wiki : il ne reste plus que trois pages à créer. Courage ! :)

Pour le moment, je vais vous parler de deux d'entre elles : voir_page.php (qui se trouve dans le dossier lib) et view.php (qui appellera le premier fichier pour afficher la page :p ).

Je doute qu'il soit possible de faire plus simple pour ces deux pages : elles se composent seulement d'une dizaine de lignes !
Il me faut avouer que le rendu (affichage) est moyen, mais bon, ici, on voit seulement la partie PHP ; alors, au boulot !

Voici le code pour voir_page.php :

<?php
 
function affiche_page($id)
        {
        GLOBAL $donnees;
        $repertoire = "pages/$id";
        
        $titre = file_get_contents($repertoire.'/titre.txt'); // On lit le fichier contenant le titre
        
        $contenu = file_get_contents($repertoire.'/contenu.txt'); // On lit le fichier contenant le contenu ><
        
        $donnees = array('Titre' => $titre, 'Contenu' => $contenu); // On met les valeurs dans un tableau
        
        return $donnees;
        }
?>

Et maintenant, passons à view.php.
Il y a plus de lignes que dans le premier fichier, mais n'oublions pas que cette page gère l'affichage. ;)

Voici le script tant attendu :

<?php
require('lib/voir_page.php'); // On récupère la fonction pour afficher la page
 
if(!isset($_GET['id'])) // Si on n'a pas fourni en paramètre l'id de la page à voir
        {
        echo 'Vous devez fournir l\'id de la page !<br />';
        exit; // On arrête le script
        }
affiche_page(intval($_GET['id'])); // On appelle la fonction qui va nous renvoyer les valeurs dans $donnees[]
 
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>'.$donnees['Titre'].'</title>
</head>
<body>
<h1>'.$donnees['Titre'];
if(!file_exists('pages/'.intval($_GET['id']).'/protect')) echo '[<a href="edit.php?id='.$_GET['id'].'">Éditer la page</a>]'; // Si l'édition n'est pas interdite
echo '</h1><p> <!-- Affichage du titre et du lien pour éditer -->';
if(!file_exists('pages/'.intval($_GET['id']).'/protect')) echo '[<a href="restauration.php?id='.$_GET['id'].'">Historique</a>]';
echo '<br />
<br />
'.$donnees['Contenu'].' <!-- On affiche le contenu de la page -->
<br />
</p>
</body>
</html>';
?>

Gérer l'historique

C'est bien beau tout ça, mais on a quand même écrit plusieurs parties de code concernant l'historique... Il serait peut-être temps de les utiliser. :)

Le code qui va suivre se nomme restauration.php et est assez long (enfin, plus long que les autres).
Pour une fois, j'ai préféré tout regrouper en un seul fichier plutôt que de tout séparer (si j'avais choisi cette dernière option, il y aurait trois fichiers, car trois actions sont possibles).

Dans un premier temps, on va afficher la date et l'heure de toutes les modifications (y compris la création de la page).

Voici le début du fichier :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Historique d'une page</title>
</head>
<body>
<p>
<?php
 
$rep = 'pages/'.intval($_GET['id']);
 
if(!isset($_GET['view']) && !isset($_GET['up'])) // Si on n'a pas encore fait d'action (regarder ou remplacer la copie en ligne par celle qu'on a choisie)
        {
?>

À la fin de ce code, on va gérer l'action qui liste toutes les modifications effectuées. ;)

On commence par mettre dans un tableau tous les dossiers du répertoire pages/save/ :

<?php
$liste_dossiers = glob($rep.'/save/*'); // On liste les dossiers du répertoire de sauvegarde
?>

Maintenant, on affiche le tout avec un foreach :

<?php
                foreach($liste_dossiers as $key) // On explore le tableau qui contient la liste des dossiers
                {
                if(is_dir($key)) // On vérifie qu'il s'agit bien d'un dossier, car glob retourne fichiers et dossiers
                        {
                       
                        $rep = $rep.'/save/';
                        $timestamp = explode('/', $key); // On récupère le timestamp, c'est-à-dire le nom du dossier
                       
                        $date = date('d/m/Y', $timestamp[3]); // $timestamp[3] correspond au timestamp (nom du dossier)
                        $heure = date('h\Hi\m\ns\s', $timestamp[3]); // On stocke l'heure
                       
                        $titre = file_get_contents('pages/'.$_GET['id'].'/save/'.$timestamp[3].'/titre.txt');
       
                        $contenu = file_get_contents('pages/'.$_GET['id'].'/save/'.$timestamp[3].'/contenu.txt');
 
                        echo '<a href="restauration.php?id='.$_GET['id'].'&view='.$timestamp[3].'">Le '.$date.' à  '.$heure.'</a>'; // On affiche un lien (pour voir la copie) avec l'heure et la date de sa création
                        echo '<br />';
                        }
                }
        echo '<br />=> <a class="a" href="view.php?id='.$_GET['id'].'">Retour a la page</a>'; // Si on veut retourner à la page que l'on consultait
}
?>

Passons à la gestion de la deuxième action, celle qui regarde la version sauvée (l'action qui suit lorsque l'on clique sur un des liens de l'historique).

La voici :

<?php
elseif(!isset($_GET['up']) && isset($_GET['view'])) //si on veut voir la copie
        {
        $lecture_titre = file_get_contents($rep.'/save/'.intval($_GET['view']).'/titre.txt');
        $lecture_contenu = file_get_contents($rep.'/save/'.intval($_GET['view']).'/contenu.txt');
       
        echo '<fieldset>
       <legend align=top> '.$lecture_titre.' - <a href="restauration.php?id='.$_GET['id'].'&up='.$_GET['view'].'">Remplacer la version actuelle par celle-là</a></legend>';
        echo $lecture_contenu; // On affiche le contenu
        echo '</fieldset>';
        }
?>

Et enfin, nous allons gérer la dernière action, celle qui s'occupe de remplacer la version en ligne par celle que l'on a choisie. :)

Voici donc la fin du script :

<?php
else // Si on veut remplacer la version actuelle par la copie
        {
        $up = intval($_GET['up']); //On récupère le timestamp de la copie que l'on veut remettre en ligne
 
        $copy = copy($rep.'/save/'.$up.'/titre.txt', $rep.'/titre.txt'); // On remplace le titre actuel par celui de la copie
        $copy = copy($rep.'/save/'.$up.'/contenu.txt', $rep.'/contenu.txt'); // On remplace le contenu actuel par celui de la copie
       
        echo 'La copie a été restaurée, elle est maintenant visible à la place de l\'autre.<br />
       <a href="view.php?id='.$_GET['id'].'">Voir la page</a><br />';
        }
 
?>
</p>
</body>
</html>

Et voilà, vous avez un historique pour chacune de vos pages !

Nous voici à la fin de ce tutoriel !

Il fut un peu long, mais l'utilisation des fichiers complique un peu la tâche.
Mais voyez plutôt les intérêts :

  • code facilement modifiable ;

  • chargement rapide des pages ;

  • une bonne portabilité du système (pas de base de données).

Si vous avez une remarque (positive ou négative) à formuler, je vous conseille de le faire dans la partie « commentaires » plutôt qu'en MP. :)

Je tiens à remercier Mickael Knight pour avoir lu, corrigé et validé mon tutoriel. ;)

Exemple de certificat de réussite
Exemple de certificat de réussite