Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Non-Officiels > Site Web > PHP > Systèmes complets > Lecture du tutoriel

Créer un wiki simple avec les fichiers

Avatar
Auteur : Nelty
Créé : le 28/11/2007 15:39:58
Modifié : le 18/03/2008 11:58:03
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bienvenue à tous dans ce tutoriel :) .

Sur cette page, je vais vous apprendre à créer un système de pages "wiki" (pages éditables par tout le monde) avec plusieurs fonctionnalités agréables.

Tout repose sur les fichiers, il n'y a donc besoin d'aucune base de données ! Cela facilite grandement la portabilité du code si vous souhaitez passer votre code à des amis ;) .

Niveau : 6/10 - Intermédiaire.

Sommaire du chapitre :

Un système qui marche avec les fichiers ?

Dans un premier temps, je vais vous décrire précisément comment les scripts vont fonctionner et ce que je n'inclurai pas dans ce tutoriel.

Comme dit dans l'introduction, nous n'utiliserons pas de base de données. Cela est un plus sur certaines choses, mais ça peut aussi compliquer la tâche du codeur.

Cependant, les fichiers garantissent une bonne organisation grâce à la création de sous-dossiers :) .

Le problème des fichiers



Je dois vous avertir, il existe un problème de taille avec les fichiers : il faut certains droits au script pour qu'il puisse créer des fichiers.

Chez certains hébergeurs il n'y a pas de problème, aucune manipulation à faire, mais en général il faut que vous changiez le CHMOD du fichier pour mettre la valeur 777 (tous les droits). Si vous ne savez pas comment faire, une petite exploration sur un moteur de recherche s'impose ;) .


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

Le fonctionnement



Je vais vous parler plus en détail du fonctionnement des scripts.

Tout d'abord, nous allons avoir un dossier qui se nommera lib : il contiendra toutes les fonctions qui seront utilisées.

Nous ferons une page view.php (pas dans le dossier lib) qui s'occupera d'afficher la page :) .
Ensuite une autre, edit.php, qui gérera tout ce qui est modification de la page.
Puis, restauration.php qui permettra la restauration (comme l'indique le nom du fichier :-° ).

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

Je veux dire par là qu'à chaque modification (dont la création), une sauvegarde sera créée. L'énorme avantage, c'est que si un boulet efface tout, en deux clics vous pourrez restaurer la page telle qu'elle était avant ! :)

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

Je ne parlerai pas...



Dans ce mini-tuto, je ne vais pas parler de toutes les fonctions qui existent en matière de Wiki.
On peut déjà citer la possibilité de séparer sa page en plusieurs parties (comme un tutoriel sur le SdZ), c'est faisable mais un peu difficile avec les fichiers.

Ensuite, la mise à la corbeille. Beaucoup d'entre vous connaissent certainement l'interface développée par Bluestorm : ZAP.
Cette interface permet notamment la fonction pour supprimer mettre à la poubelle un document (tutoriel, news, ...).
Cette fonctionnalité est très utile, elle permet de virer de la liste les documents inutiles :) .

Mais je n'en parlerai pas ici, le tutoriel apprend à créer un système de pages wiki simple, et non quelque chose de super-sophistiqué.

Je suis désolé, mais j'ai dû faire ce choix pour 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é dans ce tutoriel) : une interface permettant l'insertion de balises comme le zCode.
Encore une fois, ce choix est justifié, un tutoriel très bien réalisé existe (par madmac) : Parser du XML - L'exemple du zCode.

Voilà, j'espère ne pas avoir déçu trop de monde :( .
Enfin rassurez-vous, ce que je vais vous apprendre sera pour vous une très bonne base et vous pourrez rajouter pleins de fonctions inutiles :p .

La page d'accueil

Dans cette partie, nous allons réaliser la page d'accueil.

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

Tout d'abord, déclarons la fonction et une variable utile :
Code : PHP
1
2
3
4
5
6
7
<?php
 
function liste_pages()
        {
        GLOBAL $donnees; //cette variable sera renseignée à la fin du script
        $repertoire = "pages";
?>


Rien de bien compliqué à cela.
Maintenant, nous allons récupérer tous les dossiers du répertoire pages (vous devez créer ce dossier ;) ) :
Code : PHP
1
2
3
4
<?php
$dossiers = glob($repertoire.'/*');
asort($dossiers); //on classe les noms de dossiers pour que ça soit 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 et la troisième variable sera un compteur pour le foreach qui suit ;) .
Code : PHP
1
2
3
4
5
<?php
$noms = array();
$ids = array();
$compteur = 0;
?>


Nous pouvons maintenant faire le foreach qui va mettre le nom et l'id de la page dans les deux tableaux que nous avons créés auparavant :) .
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
foreach($dossiers as $adresse) //on va lister tout ça
                {
                if(is_dir($adresse)) //on vérifie que c'est bien 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 vous souvenez que j'ai déclaré comme "globale" la variable $donnees ? Eh bien nous allons la renseigner, elle va contenir un tableau :
Code : PHP
1
2
3
<?php
$donnees = array('Noms' => $noms, 'Id' => $ids);
?>


Voilà ! Nous avons notre fichier liste_pages.php qui contient la fonction pour lister les pages.
Il ne nous reste plus qu'à afficher tout ça sur la page index.php :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!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 éditer
        $compteur++;
        }
echo '<br /><a href="creer.php">Créer une page</a><br />';
 
?>
</p>
</body>
</html>


C'est fini pour la page d'accueil :) . Enfin, vous remarquerez que tous les liens visibles sur cette page ne vous sont pas très utiles... On va régler ça 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 faire la page creer.php qui aura pour but de créer une page ;) .
Dans un second temps, ce sera au tour de edit.php, qui permettra de modifier une page :) .

Créer une page



Encore une fois, on va créer une page qui appellera le fichier creer_page.php (qui est dans le dossier lib) ;) .
Si je sépare les fichiers comme ça, 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 .

Donc commençons par déclarer la fonction :
Code : PHP
1
2
3
4
5
<?php
function creer_page($type, $titre, $contenu)
        {
        GLOBAL $id_a_creer;
?>


Pour information :
$type contiendra normal ou protege. Si c'est protege, on fera 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 met dans un tableau la liste des fichiers & dossiers du répertoire donnée en paramètre :) .
Code : PHP
1
2
3
4
5
6
<?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 tous les id de toutes les pages
        $compteur = 0; //compteur qui servira au foreach 
?>


Nous pouvons maintenant démarrer le foreach pour qu'il nous trouve l'id de la dernière page créée. Le moyen employé est très simple, je vous laisse regarder :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?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 stoque 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
?>

Maintenant, 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 nous allons déclarer la variable $repertoire qui va nous servir pour toutes les actions sur les fichiers qui suivront :) .

Code : PHP
1
2
3
4
5
6
<?php
        $id_a_creer++;
        
        $creer_dossier = mkdir($repertoire.'/'.$id_a_creer); //on crée le dossier
        $repertoire = $repertoire.'/'.$id_a_creer;
?>


Si $type (un des paramètres de la fonction, pour rappel) est égal à protege, on crée un fichier en plus :
Code : PHP
1
2
3
4
5
6
7
<?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, ...). Tous ces moyens d'ouvrir le fichier sont disponibles ici : DOC PHP.
Dans notre cas, le moyen d'ouvrir le fichier 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 :
Code : PHP
1
2
3
4
5
<?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 : ici, il faut sauvegarder ailleurs le titre et le contenu pour qu'il soit possible, après une modification indésirée, de remettre cette version à la place de celle qui est en ligne ;) .

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?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à :) .

Maintenant, il faut que l'on crée la page creer.php (qui n'est pas dans le dossier lib) qui affichera le formulaire ;) .

Comme le code est très simple, je ne vais pas détailler son contenu, c'est inutile. Le voici :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!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>


Faites bien attention à la partie qui vérifie sur quel bouton l'on a cliqué, pour savoir si on doit empêcher l'édition ou non ;) .


Voilà : vous avez maintenant vos deux pages et vous pouvez en créer :) . Essayez d'en créer deux, et allez sur la page d'accueil : magique, il y a deux noms, maintenant !

Modification de la page



On associe souvent le mot "ajouter" à "modifier", et c'est ce qui est fait dans ce tutoriel :p .
Voyons un peu les deux pages nécessaires à la modification d'une page :) .

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 :
Code : PHP
1
2
3
4
5
<?php
function modifier_page($id, $titre = NULL, $contenu = NULL)
        {
        $repertoire = 'pages/'.$id;
?>


Je ne vais pas trop vous présenter la partie suivante, vous la comprendrez mieux lorsque je vous montrerai la deuxième page :) .

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?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'à faire la partie pour l'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 ;) .

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?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 de finir proprement la modification (ce serait bête de ne pas pouvoir utiliser la fonction ci-dessus), nous allons faire la page edit.php qui s'occupera du formulaire et du reste :) .

Bon : déjà les premières lignes du code :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!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/modifier_page.php');
require('lib/voir_page.php'); //on a aussi besoin de cette fonction pour connaître le titre et le contenu de la page
 
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
        }
?>

Ce sont les lignes indispensables pour que le reste du script fonctionne ;) .
Vous avez sûrement remarqué que nous avions besoin du script lib/voir_page.php, c'est un code que je vous donnerai plus bas :) .


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 :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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 après, bien entendu :p .
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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 !
Dans la prochaine partie, vous allez enfin pouvoir afficher les belles pages que vous avez créées :) .

Afficher une page

Nous avons presque fini notre Wiki, alors courage, il ne reste plus que trois pages à créer :) .

Ici, 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 ne sais pas si l'on peut faire plus simple pour ces deux pages, elles se composent d'une dizaine de lignes seulement !
J'avoue, le rendu (affichage) n'est pas très beau, mais bon, ici, on voit la partie PHP ; alors, au boulot !

Voici le code pour voir_page.php :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?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 ;) .

Le script tant attendu... :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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 il 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 séparé, il y aurait 3 fichiers, car il y a 3 actions 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 :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<!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 qui ont été faites ;) .

On commence par mettre dans un tableau tous les dossiers du répertoire pages/save/ :
Code : PHP
1
2
3
<?php
$liste_dossiers = glob($rep.'/save/*'); //on liste les dossiers du répertoire de sauvegarde
?>


Maintenant, on affiche avec un foreach :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
                foreach($liste_dossiers as $key) //on explore le tableau qui contient la liste des dossiers
                {
                if(is_dir($key)) //on vérifie que c'est bien 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 :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?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 :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?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 est un peu long, mais l'utilisation des fichiers complique un peu la tâche.
Sauf que voyez plutôt les intérêts :


Quelques fois (la dernière, c'est trois lignes plus haut), j'ai dit qu'utiliser les fichiers n'était pas une chose facile. Il est sûr et certain que je verrai dans les commentaires des messages du style "mais c'est super facile de les utiliser !". Je suis d'accord avec eux, mais si vous essayez de faire tout ce que nous avons fait version SQL, vous verrez bien que l'utilisation des fichiers rallonge un peu le code ;) .


Si vous avez une remarque (bonne ou mauvaise) à faire, je vous conseille de le faire dans les commentaires plutôt qu'en MP :) .

Je tiens à remercier Mickael Knight pour avoir lu, corrigé et validé mon tutoriel ;) .
Auteur : Nelty
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 413 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.0727s (0.0519s)