Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Systèmes complets > Créer son forum de toutes pièces > Les pages administration > Administration Partie I > Lecture du tutoriel

Administration Partie I

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)
Avatar
Auteur : General Vans
Note : 19 / 20 (11 votes)
Visualisations : 9 167

Plus d'informations Plus d'informations
On y arrive : le forum touche à sa fin, et la partie la plus intéressante est là ! L'administration d'un forum est la touche finale dans la mesure où elle vous permettra, une fois mise en place, de n'accéder à la base de données qu'en cas de problèmes.
Une fois le script réalisé, vous serez totalement indépendants et le forum pourra commencer à tourner normalement.
Ça fait rêver, hein ? :p

Bon. Malheureusement, le script est à la fois long et tordu, il va donc falloir s'accrocher un minimum ^^ . Pas de panique toutefois, ce n'est pas non plus spécialement compliqué : ce qui est embêtant, c'est la longueur des codes. C'est pour cela que j'ai décidé de séparer le chapitre en deux parties. Ici, nous verrons la page admin.php, qui servira de formulaire en quelque sorte, tandis que dans un second temps, nous verrons la page adminok.php (je sais, ça veut rien dire... :D ) qui s'occupera de tout le traitement.

Allez 1, 2, 3, c'est parti !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Structure de la page

Une seule page pour toute la partie administration (enfin, 2, mais une seule pour la récupération d'informations), cette phrase a peut être dû vous choquer. Vous vous dites :
"hop hop hop mais comment on va pouvoir mettre tout ce qu'on veut faire là-dedans (gestion des forums, des membres, du bannissement, des configurations, des catégories, des droits...) :euh: ?"
Eh bien la réponse à cette question, c'est qu'on va utiliser un double switch (prononcez à l'anglaise pour plus de style ^^ ) !

Le double switch



Le premier switch récupère en fait des infos sur ce que l'on va toucher (forum ou membre, par exemple), il les prend dans l'url grâce à la variable cat. Le second s'insère dans le premier, et donne des infos supplémentaires (par exemple édition) ; lui, il prend les infos grâce à la variable action, qui se trouve également dans l'url.
Si la variable action est absente, on affiche le menu de la catégorie qu'on a choisie ; si la variable cat est absente, on affiche le menu général de l'administration.
Ça va, vous me suivez ? :p

Voilà la structure de la page, vous comprendrez sûrement mieux ensuite :

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?
$cat = htmlspecialchars($_GET['cat']); //on récupère dans l'url la variable cat
switch($cat) //1er switch
{
case "config":
//ici configuration
break;
 
case "forum":
//Ici forum
$action = htmlspecialchars($_GET['action']); //On récupère la valeur de action
        switch($action) //2eme switch
        {
        case "creer":
        //Création d'un forum
        break;
        
        case "edit":
        //Edition d'un forum
        break;
        
        case "droits":
        //Gestion des droits
        break;
        
        default; //action n'est pas remplie, on affiche le menu
        echo'<h1>Administration des forums</h1>';
        echo'<p>Bonjour, cher administrateur :p, que veux tu faire ?
        <br />
        <a href="./admin.php?cat=forum&amp;action=creer">Créer un forum</a>
        <br />
        <a href="./admin.php?cat=forum&amp;action=edit">Modifier un forum</a>
        <br />
        <a href="./admin.php?cat=forum&amp;action=droits">
        Modifier les droits d un forum</a><br /></p>';
        break;
        }
break;
 
case "membres":
//Ici membres
$action = htmlspecialchars($_GET['action']); //On récupère la valeur de action
        switch($action) //2eme switch
        {
        case "edit":
        //Edition d'un membre
        break;
        
        case "droits":
        //Droits d'un membre (rang)
        break;
        
        case "ban":
        //Bannissement
        break;
        
        default; //action n'est pas remplie, on affiche le menu 
        echo'<h1>Administration des membres</h1>';
        echo'<p>Salut mon ptit, alors tu veux faire quoi ?<br />
        <a href="./admin.php?cat=membres&amp;action=edit">
        Editer le profil d un membre</a><br />
        <a href="./admin.php?cat=membres&amp;action=droits">
        Modifier les droits d un membre</a><br />
        <a href="./admin.php?cat=membres&amp;action=ban">
        Bannir / Debannir un membre</a><br /></p>';
        break;
        }
break;
default; //cat n'est pas remplie, on affiche le menu général
echo'<h1>Index de l administration</h1>';
echo'<p>Bienvenue sur la page d administration.<br />
<a href="./admin.php?cat=config">Configuration du forum</a><br />
<a href="./admin.php?cat=forum">Administration des forums</a><br />
<a href="./admin.php?cat=membres">Administration des membres</a><br /></p>';
break;
}
?>


Vous pouvez comme ça avoir déjà une idée de ce que l'on va réaliser par la suite... Après, si vous voulez ajouter d'autres fonctions, vous n'aurez qu'à les insérer dans ce squelette.

Une nouvelle table



Comme je vous l'avais promis tout au long de la partie 1 de ce tuto, on va pouvoir grâce à l'administration fixer la valeur de certaines variables, comme, par exemple, la taille de l'avatar. Mais vous comprenez bien qu'il faut stocker ces valeurs quelque part : c'est pourquoi nous allons avoir besoin d'une nouvelle table, un peu spéciale puisqu'elle ne contient que deux champs : config_name, qui représente le nom du paramètre et config_valeur, qui représente sa... valeur !

Je ne vois pas comment ça peut marcher ton truc : config_valeur, ça peut être un entier comme une chaîne de caractères, et pourtant faut bien faire un choix, non ?


Oui, c'est vrai que c'est un problème, le mieux est encore d'utiliser VARCHAR : ce type de champ stocke normalement des chaînes de caractères, mais on peut très bien y mettre des chiffres, la seule différence avec INT, c'est qu'on ne pourra faire aucun calcul avec, sur la base de données.

Code : SQL
1
2
3
4
CREATE TABLE `forum_config` (
config_nom VARCHAR( 200 ) NOT NULL ,
config_valeur VARCHAR( 500 ) NOT NULL
) TYPE = MYISAM ;


Et voilà pour la table !

Les autorisations



Ce que je vais dire là va sûrement vous paraître évident, mais on n'est jamais trop prudent. Seuls les administrateurs ont accès au panneau d'administration, autrement dit à la page admin.php. Libre à vous de mettre un lien vers celle-ci où vous voulez, mais assurez-vous que celui-ci ne s'affiche que pour les administrateurs (utilisez la fonction auth_verif pour cela). Et comme d'habitude, une seconde vérification s'impose sur la page admin.php, afin d'être sûrs que personne ne s'y est introduit en modifiant l'url.

Vous pouvez également jouer sur les autorisations, et faire des parties du panneau d'administration que les modérateurs pourront lire (et donc modifier) afin d'alléger le travail des administrateurs.
Bon : je m'arrête ici, vous voyez qu'il y a des dizaines de façon de personnaliser les scripts qui vont suivre.

Configuration

On commence tout de suite avec la configuration du forum, c'est-à-dire comme je l'ai dit plus haut, donner des valeurs à des variables par-ci par-là, pour pouvoir les modifier plus rapidement qu'en changeant les scripts.
Mais avant toute chose, il va nous falloir lister un peu toutes ces variables.

Concernant l'enregistrement
Avatar

Signature

Pseudo

Concernant les topics et posts
Topics

posts


Ça fera déjà un bon début : de toutes façons, si vous voulez ajouter quelque chose, vous pouvez le faire très facilement.

Modification de la base de données



Encore ?!


Oui, cette fois il faut remplir un peu notre nouvelle table avec les noms de nos paramètres, et des valeurs par défaut.

Code : SQL
1
2
3
4
5
6
7
8
9
INSERT INTO forum_config VALUES ('avatar_maxsize', '10 000');
INSERT INTO forum_config VALUES ('avatar_maxh', '100 '); 
INSERT INTO forum_config VALUES ('avatar_maxl', '100 '); 
INSERT INTO forum_config VALUES ('sign_maxl', '200');
INSERT INTO forum_config VALUES ('auth_bbcode_sign', 'oui');
INSERT INTO forum_config VALUES ('pseudo_maxsize', '15');
INSERT INTO forum_config VALUES ('pseudo_minsize', '3');
INSERT INTO forum_config VALUES ('topic_par_page', '20');
INSERT INTO forum_config VALUES ('post_par_page', '15');


Cette liste n'a de limite que votre imagination, à vous de la compléter, en annexe de ce tuto, vous trouverez un petit paragraphe sur le sujet.

On affiche le formulaire



Heureusement, le code de cette partie est très simple et très court : il suffit de faire une requête qui retire tout ce qui se trouve dans la table forum_config, et d'afficher le tout dans un formulaire.

Mais il faut avant faire une petite modification : vous avez pu remarquer que les entrées qui se trouvent dans la colonne config_name sont carrément baroques, on ne peut pas les afficher comme cela. Donc, deux choix s'offrent à vous : soit vous ajoutez une colonne à cette table, qui contiendra ainsi le texte à afficher, soit vous faites un tableau, qui associe le nom brut au nom à afficher. J'ai choisi cette deuxième méthode, mais la première est tout aussi bien, mieux même si vous voulez pouvoir tout gérer depuis la base de données, sans avoir à modifier les scripts.

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
<?
case "config":
//ici configuration
echo'<h1>Configuration du forum</h1>';
echo '<form method="post" action="adminok.php?cat=config">';

//Le tableau associatif
$config_name = array(
"avatar_maxsize" => "Taille maximale de l avatar",
"avatar_maxh" => "Hauteur maximale de l avatar",
"avatar_maxl" => "Largeur maximale de l avatar",
"sign_maxl" => "Taille maximale de la signature",
"auth_bbcode_sign" => "Autoriser le bbcode dans la signature",
"pseudo_maxsize" => "Taille maximale du pseudo",
"pseudo_minsize" => "Taille minimale du pseudo",
"topic_par_page" => "Nombre de topics par page",
"post_par_page" => "Nombre de posts par page"
);
$requete_config= mysql_query('SELECT config_nom, config_valeur FROM forum_config');
while($data_config = mysql_fetch_assoc($requete_config))
{
           echo '<p><label for='.$data_config['config_nom'].'>
           '.$config_name[$data_config['config_nom']].' </label> :
           <input type="text" id="'.$data_config['config_nom'].'"
           value="'.$data_config['config_valeur'].'"
           name="'.$data_config['config_nom'].'"></p>';
}
echo '<p><input type="submit" value="Envoyer" /></p></form>';
break;


Voilà : vous obtenez maintenant un formulaire qui n'attend plus qu'à être modifié ; d'ailleurs, il va attendre un peu parce que la page adminok.php est pour le chapitre suivant.
Pour revenir au script ci-dessus, c'est sûr : ce n'est pas très beau, on aurait pu organiser les champs entre eux, mettre des sous-titres, etc. Mais souvenez-vous que cette page ne sera vue que par les administrateurs : donc, à vous de voir si vous jugez important d'améliorer le design :p .

Pourquoi ce tableau au final, on ne peut pas envoyer tout simplement le nom affiché, plutôt que le nom brut ?


On pourrait ; à vrai dire, j'avais fait comme ça au début, mais le problème, c'est que dès qu'il y a des espaces, ça devient plus compliqué : il faut les remplacer par des tirets bas "_" ; croyez-moi, cette méthode est plus simple, même si elle n'en a pas l'air tout de suite :) .

Par ailleurs, pour que cette page serve à quelque chose, il va falloir bien entendu modifier les scripts dans lesquels apparaissent les variables en question, pour cela je vous laisse faire, il y a plusieurs méthodes dont une exposée en annexe du tuto.

Passons à présent à la gestion des forums, c'est un peu plus long et un peu plus compliqué, alors on s'accroche, et ça ira ^^ .

Gestion des forums

On continue avec l'administration des forums et des catégories.
Commençons en douceur avec la création d'un forum.

Créer un forum



Lorsque vous créez un forum, vous renseignez les champs de la table forum_forum. Il faut donc indiquer le nom, la catégorie et la description. Seulement, il ne faut pas oublier un détail : lorsque vous commencez votre forum, il n'y a pas de catégorie dessus :waw: ; donc, on va également proposer à l'administrateur de créer une catégorie.

Voici comment va s'organiser le script.
- Si l'url ne contient pas la variable c, on demande à l'admin ce qu'il veut créer (forum ou catégorie).
- Si c contient forum, on lance le formulaire pour la création d'un forum.
- Si c contient catégorie, on lance le formulaire pour la création d'une catégorie.

Le code n'a rien d'extraordinaire, je le mets donc d'un coup :

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
36
37
38
39
40
41
42
43
44
<?
case "creer":
        //Création d'un forum

        //1er cas : pas de variable c
        if(empty($_GET['c']))
        {
                echo'<br /><br /><br />Que voulez-vous faire?<br />
                <a href="./admin.php?cat=forum&action=creer&c=f">Créer un forum</a><br />
                <a href="./admin.php?cat=forum&action=creer&c=c">Créer une catégorie</a></br>';
        }

        //2ème cas : on cherche à créer un forum (c=f)
        elseif($_GET['c'] == "f")
        {
                $requete = mysql_query('SELECT cat_id, cat_nom FROM forum_categorie 
                ORDER BY cat_ordre DESC');
                echo'<h1>Création d un forum</h1>';
                echo'<form method="post" action="./adminok.php?cat=forum&action=creer&c=f">';
                echo'<label>Nom :</label><input type="text" id="nom" /><br /><br />
                <label>Description :</label>
                <textarea cols=40 rows=4 name="desc" name="desc"></textarea>
                <br /><br />
                <label>Catégorie : </label><select name="cat">';
                while($data = mysql_fetch_assoc($requete))
                {
                echo'<option value="'.$data['cat_id'].'">'.$data['cat_nom'].'</option>';
                }
                echo'</select><br /><br />
                <input type="submit" value="Envoyer"></form>';
        }
       
        //3ème cas : on cherche à créer une catégorie (c=c)
        elseif($_GET['c'] == "c")
        {
                echo'<h1>Création d une catégorie</h1>';
                echo'<form method="post" action="./adminok.php?cat=forum&action=creer&c=c">';
                echo'<label> Indiquez le nom de la catégorie :</label> 
                <input type="text" id="nom" name="nom" /><br /><br />   
                <input type="submit" value="Envoyer"></form>';
        }
        
        break;
?>


Vous voyez qu'on n'a pas grand-chose à faire pour créer un forum, et encore moins pour créer une catégorie. En revanche, après, il ne faudra pas oublier d'y inscrire les droits de celui-ci et son ordre. Nous allons voir ça tout de suite.

Édition d'un forum



Là, on arrive à la partie costaud de la page, l'édition d'un forum, mais aussi -je le rappelle- d'une catégorie doit en effet prendre en compte plusieurs choses. Pour être plus clair, il va en fait falloir faire comme précédemment, c'est-à-dire encore subdiviser le script en plusieurs cas. Il y a tout d'abord l'édition basique d'un forum, c'est-à-dire changer son nom, sa description ou encore le déplacer ; ensuite l'édition d'une catégorie, c'est-à-dire tout simplement changer son nom. Enfin, il y a la réorganisation des forums et des catégories.
C'est une variable que j'ai nommée e, et qui se balade dans l'url qui nous permettra de savoir quoi faire ^^ .

1er Cas : Rien n'est renseigné



Voyons tout d'abord le premier cas, le plus basique : e n'existe pas, on affiche alors un sous-menu :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?
case "edit":
        //Edition d'un forum
        echo'<h1>Edition d un forum</h1>';
        
        if(!isset($_GET['e']))
        {
                echo'<p>Que voulez vous faire ?<br />
                <a href="./admin.php?cat=forum&action=edit&amp;e=editf">
                Editer un forum</a><br />
                <a href="./admin.php?cat=forum&action=edit&amp;e=editc">
                Editer une catégorie</a><br />
                <a href="./admin.php?cat=forum&action=edit&amp;e=ordref">
                Changer l ordre des forums</a><br />
                <a href="./admin.php?cat=forum&action=edit&amp;e=ordrec">
                Changer l ordre des catégories</a>
                <br /></p>';
        }
?>


Comme d'habitude, en fait :p . J'en profite pour vous signaler à la suite de certaines remarques que ce que je fais est très moche, j'en suis conscient, mais c'est à vous de l'adapter. Par exemple, vous pouvez faire ça sous forme de liste déroulante, ou encore mettre des images, que sais-je encore;) .

2ème cas : Édition d'un forum



Pour ce cas-là non plus, pas de difficulté mais un code un peu plus long ; en effet, il va dans un premier temps falloir demander de choisir le forum à éditer dans une liste, avant d'afficher les infos que l'on a sur celui-ci et de les modifier.

Les infos en question sont le nom, la description et la catégorie où il se trouve. C'est ce dernier renseignement qui va nous demander un peu plus de code : il faudra boucler toutes les catégories du forum, et mettre le tout dans une liste déroulante.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?
elseif($_GET['e'] == "editf")
        {
                //On affiche dans un premier temps la liste des forums
                if(!isset($_POST['forum']))
                {
                $requete = mysql_query('SELECT forum_id, forum_name
                FROM forum_forum ORDER BY forum_ordre DESC');
                
                echo'<form method="post" 
                action="admin.php?cat=forum&amp;action=edit&amp;e=editf">';
                echo'<p>Choisir un forum :</br /></h2>
                <select name="forum">';
                
                while($data = mysql_fetch_assoc($requete))
                {
                echo'<option value="'.$data['forum_id'].'">
                '.stripslashes(htmlspecialchars($data['forum_name'])).'</option>';
                }
                echo'<input type="submit" value="Envoyer"></p></form>';
                }
               
                //Ensuite, on affiche les renseignements sur le forum choisi
                else
                {
                $requete1 = mysql_query('SELECT forum_id, forum_name, forum_desc, 
                forum_cat_id
                FROM forum_forum
                WHERE forum_id = "'.$_POST['forum'].'"');
                $data1 = mysql_fetch_assoc($requete1);

                echo'<p>Edition du forum
                <strong>'.stripslashes(htmlspecialchars($data1['forum_name'])).'</strong></p>';
               
                echo'<form method="post"
                action="adminok.php?cat=forum&amp;action=edit&amp;e=editf">

                <label>Nom du forum : </label><input type="text" id="nom" 
                name="nom" value="'.stripslashes($data1['forum_name']).'" />
                <br />
                
                <label>Description :</label><textarea cols=40 rows=4 name="desc"
                id="desc">'.$data1['forum_desc'].'</textarea><br /><br />';
                
                //A partir d'ici, on boucle toutes les catégories, 
                //On affichera en premier celle du forum

                $requete2 = mysql_query('SELECT cat_id, cat_nom 
                FROM forum_categorie ORDER BY cat_ordre DESC');

                echo'<label>Déplacer le forum vers : </label>
                <select name="depl">';
                while($data2 = mysql_fetch_assoc($requete2))
                {
                if($data2['cat_id'] == $data1['forum_cat_id']) 
                {
                echo'<option value="'.$data2['cat_id'].'" 
                selected="selected">'.stripslashes(htmlspecialchars($data2['cat_nom'])).'</option>';
                }
                else 
                {
                echo'<option value="'.$data2['cat_id'].'">
                '.$data2['cat_nom'].'</option>';
                }
                }
                echo'</select><input type="hidden" name="forum_id"
                value="'.$data1['forum_id'].'">';
                echo'<p><input type="submit" value="Envoyer"></p></form>';
                }
        }
?>


C'est un peu comme ce que l'on a vu pour les droits des membres, c'est-à-dire qu'on affiche en premier la catégorie où se trouve le forum, ça permet une lecture plus facile, et puis ça évite de déplacer un forum sans faire exprès :) .
Le champ caché envoie la valeur de l'id du forum qui a été choisi, il va permettre de décharger un peu l'url qui contient déjà un paquet de variables : on récupérera simplement cette valeur avec $_GET['forum_id'].

3ème cas : Édition d'une catégorie



Ce cas-ci est quasiment similaire au précédent... mais en plus court. Pour le coup, il suffit de modifier le nom et puis c'est tout, une catégorie ne contenant pas de description, ni rien.
Donc on affiche la liste des catégories, on envoie et on modifie le nom, puis le tour est joué :) .

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
36
37
38
<?
elseif($_GET['e'] == "editc")
        {
                //On commence par afficher la liste des catégories
                if(!isset($_POST['cat']))
                {
                $requete = mysql_query('SELECT cat_id, cat_nom
                FROM forum_categorie ORDER BY cat_ordre DESC');
                echo'<form method="post" 
                action="admin.php?cat=forum&amp;action=edit&amp;e=editc">';
                echo'<p>Choisir une catégorie :</br />
                <select name="cat">';
                while($data = mysql_fetch_assoc($requete))
                {
                echo'<option value="'.$data['cat_id'].'">
                '.$data['cat_nom'].'</option>';
                }
                echo'<input type="submit" value="Envoyer"></p></form>';
                }
          
                //Puis le formulaire
                else
                {
                $requete = mysql_query('SELECT cat_nom FROM forum_categorie
                WHERE cat_id = "'.$_POST['cat'].'"');
                $data = mysql_fetch_assoc($requete);
                echo'<form method="post" 
                action="./adminok.php?cat=forum&amp;action=edit&amp;e=editc">';

                echo'<label> Indiquez le nom de la catégorie :</label> 
                <input type="text" id="nom" name="nom" 
                value="'.stripslashes(htmlspecialchars($data['cat_nom'])).'" />
                <br /><br />    
                <input type="hidden" name="cat" value="'.$_POST['cat'].'" />
                <input type="submit" value="Envoyer" /></p></form>';
                }
        }
?>


Bon bah, pas grand chose à redire là-dessus, on affiche le nom et encore une fois, un champ caché est envoyé à la page d'action afin que l'on connaisse la valeur de l'id de la catégorie à modifier.

4ème cas : Ordonner les forums



Ce que l'on va faire dans cette partie est assez simple à comprendre : on affiche, comme sur la page d'index, les forums rangés par catégories. Seulement, cette fois on inscrit ni le nombre de posts, ni celui de topics ou autres, mais simplement un champ texte avec la valeur du champ forum_ordre à l'intérieur. L'administrateur pourra ainsi facilement les modifier, puis envoyer le tout à la page de traitement pour réordonner ses forums.

Voici le code :

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
36
<?
elseif($_GET['e'] == "ordref")
        {
                $categorie="";
                $requete = mysql_query('SELECT forum_id, forum_name, forum_ordre, 
                forum_cat_id, cat_id, cat_nom
                FROM forum_categorie
                LEFT JOIN forum_forum ON cat_id = forum_cat_id
                ORDER BY cat_ordre DESC');

                echo'<form method="post" 
                action="adminok.php?cat=forum&amp;action=edit&amp;e=ordref">';
                
                echo '<table>';

                while($data = mysql_fetch_assoc($requete))
                {
                if( $categorie != $data['cat_id'] )
                {
                        $categorie = $data['cat_id'];
                        echo'
                        <tr>       
                        <th><strong>'.stripslashes(htmlspecialchars($data['cat_nom'])).'</strong></th>
                        <th><strong>Ordre</strong></th>
                        </tr>';
                }
                echo'<tr><td><a href="./voirforum.php?f='.$data['forum_id'].'">
                '.$data['forum_name'].'</a></td>
                <td><input type="text" value="'.$data['forum_ordre'].'" 
                name="'.$data['forum_id'].'" />
                </td></tr>';
                }
                echo'</table>
                <p><input type="submit" value="Envoyer" /></p></form>'; 
        }
?>


Ça doit vous rappeler quelque chose, non ? ^^ C'est en effet de cette manière que l'on avait affiché les forums sur la page d'index. Ce que l'on fait là, c'est un tableau, tout ce qu'il y a de plus simple : avec deux colonnes, une pour le nom, et une pour l'ordre. On fait ensuite passer à la page de traitement le nouvel ordre de chaque forum, qui se trouveront inscrits dans des variables du type $_POST[9], où 9 est l'id du forum. Cela permettra de les coupler à leur forum.

5ème cas : Ordonner les catégories



Très simple et très court : il suffit d'afficher les catégories avec un champ texte qui contient leur numéro d'ordre. Il est inutile de les ranger dans un tableau, il faut juste les ordonner.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?
elseif($_GET['e'] == "ordrec")
        {
                $requete = mysql_query('SELECT cat_id, cat_nom, cat_ordre 
                FROM forum_categorie
                ORDER BY cat_ordre DESC');
 
                echo'<form method="post" 
                action="adminok.php?cat=forum&amp;action=edit&amp;e=ordrec">';
                while($data = mysql_fetch_assoc($requete))
                {
                echo'<label>'.stripslashes(htmlspecialchars($data['cat_nom'])).' :</label> 
                <input type="text" value="'.$data['cat_ordre'].'" 
                name="'.$data['cat_id'].'" /><br /><br />';
                }
                echo '<input type="submit" value="Envoyer" /></form>'; 
        }
        break;
?>


Et du coup c'est terminé : ce code est quasiment le même que celui qui précède. Comme vous pouvez le voir, il n'y a pas grand-chose à modifier sur une catégorie, si ce n'est son nom... Je rappelle que pour l'ordre, on a vu plus haut comment faire.

Bien, passons à présent aux droits d'un forum, puis on en aura terminé avec cette page :) .

Droits d'un forum



Allez, un dernier effort !

Ce que l'on veut faire ici, c'est afficher pour un forum donné les autorisations qui lui sont propres. Donc, on va encore séparer le code en deux : d'abord le formulaire, qui est en fait une liste déroulante grâce à laquelle on va choisir le forum. Ensuite, on va afficher dans un tableau une série de listes déroulantes, pour chaque type d'autorisation (lire, poster, modérer...), qui seront automatiquement placées sur la valeur actuelle.

Le problème est le suivant : je rappelle que les noms des groupes sont des entiers. Or, on veut afficher du texte pour que l'administrateur sache ce qu'il fait. On va donc utiliser un tableau qui associe encore une fois numéro d'autorisation et sa valeur concrète.

Toutefois, contrairement au script sur les droits des membres, on doit afficher plusieurs listes, c'est pourquoi on aura besoin de faire une boucle dans la première boucle, et par la même occasion, on va devoir utiliser un tableau qui associe les noms des champs (auth_view, auth_topic...) en quelque chose de plus parlant (lire, poster...).

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?
case "droits":
        //Gestion des droits
        echo'<h1>Edition des droits</h1>';      
        
        if(!isset($_POST['forum']))
        {
                $requete = mysql_query('SELECT forum_id, forum_name
                FROM forum_forum ORDER BY forum_ordre DESC');
                echo'<form method="post" 
                action="admin.php?cat=forum&action=droits">';
                echo'<p>Choisir un forum :</br />
                <select name="forum">';
                while($data = mysql_fetch_assoc($requete))
                {
                        echo'<option value="'.$data['forum_id'].'">
                        '.stripslashes(htmlspecialchars($data['forum_name'])).'</option>';
                }
                echo'<input type="submit" value="Envoyer"></p></form>';
        }
        else
        {
        $requete = mysql_query('SELECT forum_id, forum_name, auth_view,
        auth_post, auth_topic, auth_annonce, auth_modo 
        FROM forum_forum WHERE forum_id = '.$_POST['forum'].'');

        echo'<form method="post" 
        action="adminok.php?cat=forum&action=droits"><p><table><tr>
        <th>Lire</th>
        <th>Répondre</th>
        <th>Poster</th>
        <th>Annonce</th>
        <th>Modérer</th>
        </tr>';
        $data = mysql_fetch_assoc($requete);
       
        //Ces deux tableaux vont permettre d'afficher les résultats
        $rang = array("Visiteur", "Membre", "Modérateur","Administrateur");
        $list_champ = array("auth_view", "auth_post", "auth_topic",
        "auth_annonce", "auth_modo");
  
        //On boucle
        foreach($list_champ as $champ)
        {
        echo'<td><select name="'.$champ.'">';
        for($i=0;$i<4;$i++)
                {
                if ($i == $data[$champ])
                {
                echo'<option value="'.$i.'"
                 selected="selected">'.$rang[$i].'</option>';
                }
                else
                {
                echo'<option value="'.$i.'">
                '.$rang[$i].'</option>';
                }
                }
        echo'</td></select>';
        }
        echo'<br /><input type="hidden" name="forum_id" 
        value="'.$data['forum_id'].'" />
        <input type="submit" value="Envoyer"></p></form>';
        }
        echo '</table>';
        break;
?>


Ce qu'il faut bien comprendre, c'est que le foreach parcourt le premier tableau, il va donc commencer à auth_view, puis il va afficher en priorité la valeur actuelle de auth_view avant d'afficher les autres, grâce à la seconde boucle. Puis ainsi de suite... :)

Gestion des membres

Nous allons voir tout ce qui concerne la partie administration, et qui a un rapport avec les membres.

Édition d'un profil



Cette partie ressemble énormément à la page de modification du profil : la seule différence est que cette fois ce n'est pas le membre, mais l'administrateur qui modifie les infos sur son compte. C'est pourquoi il faut dans un premier temps lui demander de qui il veut modifier le profil.

Voilà comment s'organise ce code :
- on regarde si la variable $_POST['membre'] est renseignée
. si ce n'est pas le cas, c'est qu'on arrive à l'instant, on propose alors un formulaire qui demande d'entrer le pseudo d'un membre.
. Si c'est le cas, on affiche un formulaire avec les infos du membres (comme sur la page de profil).

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?
case "membres":
//Ici membres
$action = htmlspecialchars($_GET['action']); //On récupère la valeur de action
        switch($action) //2ème switch
        {
        case "edit":
        //Edition d'un membre
        echo'<h1>Edition du profil d un membre</h1>';   

        if(!isset($_POST['membre'])) //Si la variable $_POST['membre'] n'existe pas
        {
                echo'De quel membre voulez-vous éditer le profil ?<br />';
                echo'<br />
                <form method="post" 
                action="./admin.php?cat=membres&amp;action=edit">
                <p><label for="membre">Inscrivez le pseudo : </label> 
                <input type="text" id="membre" name="membre">
                <input type="submit" name="Chercher"></p></form>';
        }
?>


Ici, on a affiché le formulaire, c'est la méthode que j'ai choisie ; mais vous pouvez très bien vous en passer, et demander l'id simplement.
Passons maintenant à la suite :

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?
else //sinon
        {
                $pseudo_d = mysql_real_escape_string($_POST['membre']);

                //Requête qui ramène des info sur le membre à 
                //Partir de son pseudo
                $requete_select = mysql_query('SELECT membre_id, 
                membre_pseudo, membre_email,
                membre_siteweb, membre_signature, 
                membre_msn, membre_localisation, membre_avatar
                FROM forum_membres WHERE membre_pseudo="'.$pseudo_d.'"');
                 
                //Si la requête retourne un truc, le membre existe
                if ($data_select = mysql_fetch_assoc($requete_select)) 
                {
                ?>
                <form method="post" 
                action="adminok.php?cat=membres&amp;action=edit" 
                enctype="multipart/form-data">
       

                <fieldset><legend>Identifiants</legend>
                <label for="pseudo">Pseudo :</label>
                <input type="text" name="pseudo" id="pseudo" 
                value="<?php echo stripslashes(htmlspecialchars($data_select['membre_pseudo'])); ?>" /><br />
                </fieldset>

                <fieldset><legend>Contacts</legend>
                <label for="email">Adresse E_Mail :</label>
                <input type = "text" name="email" id="email"
                value="<?php echo stripslashes(htmlspecialchars($data_select['membre_email'])); ?>" /><br />

                <label for="msn">Adresse MSN :</label>
                <input type = "text" name="msn" id="msn"
                value="<?php echo stripslashes(htmlspecialchars($data_select['membre_msn'])); ?>" /><br />

                <label for="website">Site web :</label>
                <input type = "text" name="website" id="website"
                value="<?php echo stripslashes(htmlspecialchars($data_select['membre_siteweb'])); ?>"/><br />
                </fieldset>

                <fieldset><legend>Informations supplémentaire</legend>
                <label for="localisation">Localisation :</label>
                <input type = "text" name="localisation" id="localisation"
                value="<?php echo stripslashes(htmlspecialchars($data_select['membre_localisation'])); ?>" />
                <br />
                </fieldset>
               
                <fieldset><legend>Profil sur le forum</legend>
                <label for="avatar">Changer l avatar :</label>
                <input type="file" name="avatar" id="avatar" />
                <br /><br />
                <label><input type="checkbox" name="delete" value="Delete" />
                Supprimer l avatar</label>
                Avatar actuel :
                <?php echo'
                <img src="./images/avatars/'.$data_select['membre_avatar'].'"
                alt="pas d avatar" />' ?>
     
                <br /><br />
                <label for="signature">Signature :</label>
                <textarea cols=40 rows=4 name="signature" id="signature">
                <?php echo $data_select['membre_signature'] ?></textarea>
     
                <br /></h2>
                <fieldset>
                <?php
                echo'<input type="hidden" value="'.stripslashes($pseudo).'" name="pseudo">
                <input type="submit" value="Modifier le profil" /></form>';
                }
                else echo' <p>Erreur : Ce membre n existe pas, <br />
                cliquez <a href="./admin.php?cat=membres&amp;action=edit">ici</a>
                pour réessayez</p>';
        }
        break;
?>


Vous avez sûrement remarqué qu'il s'agit, à quelques modifications près, de la page voirprofil.php dans sa partie modification. Ce qui est parfaitement normal, étant donné qu'on veut faire la même chose.
Pour reprendre le code, on sécurise d'abord la variable créée avec le pseudo passé par le formulaire, ça peut paraître étrange qu'un admin décide d'hacker son propre forum, mais bon, ça ne coûte rien. Grâce à celle-ci, on lance une requête, on prend les infos que l'on a dans la base de données sur le membre. Si elle ne retourne rien, c'est que le membre n'existe pas (par exemple, si le pseudo a été mal orthographié), sinon tout va bien, on affiche le formulaire.
Il est surprenant qu'un administrateur trouve une raison pour modifier le mot de passe d'un membre, c'est pourquoi j'ai retiré cette option du formulaire :p .

Comme promis, la page de traitement viendra plus tard, passons alors aux droits des membres.

Droits des membres



Comme toute personne, les membres ont des droits, la différence est que dans votre forum, c'est vous qui décidez de quels droits ils disposeront. ^^
Pour cela, on va organiser la page comme ceci : on demande d'entrer un nom dans un formulaire, et on retourne le niveau d'autorisation de celui-ci, ensuite on propose de changer ce niveau.

Pour ceux qui ont décidé d'utiliser la méthode qui associe groupes et forums, le mieux est d'afficher tous les forums, avec pour chacun les droits du membre, et de modifier le tout.


Pour le début, ça sera exactement pareil que précédemment : donc, il n'y a pas grand chose à expliquer.
Bref, voilà la page :

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
<?
case "droits":
        //Droits d'un membre (rang)
        echo'<h1>Edition des droits d un membre</h1>';  

        if(!isset($_POST['membre']))
        {
                echo'De quel membre voulez-vous modifier les droits ?<br />';
                echo'<br /><form method="post" 
                action="./admin.php?cat=membres&action=droits">
                <p><label for="membre">Inscrivez le pseudo : </label> 
                <input type="text" id="membre" name="membre">
                <input type="submit" value="Chercher"></p></form>';
        }
        else
        {
                $pseudo = mysql_real_escape_string($_POST['membre']);
                $requete_membre = mysql_query('SELECT membre_pseudo,membre_rang
                FROM forum_membres WHERE membre_pseudo = "'.$pseudo.'"');
                if ($data = mysql_fetch_assoc($requete_membre))
                {       
                echo'<form action="./adminok.php?cat=membres&amp;action=droits" 
                method="post">';
?>


C'est ici qu'on est confrontés à un petit problème : comment présenter le formulaire. Le mieux est de faire une liste déroulante avec les différents grades. Oui, mais voilà, comment faire pour savoir quel est l'original ? Par exemple, si je tombe sur un modérateur, comment mettre en "selected" modérateur ?
Le plus facile est de créer un tableau qui associe à chaque chiffre recueilli dans le champ membre_rang le nom qu'il représente. Ensuite, grâce à une boucle, on pourra facilement faire ce que l'on veut.

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
<?
$rang = array
                (0 => "Bannis",
                1 => "Visiteur", 
                2 => "Membre", 
                3 => "Modérateur", 
                4 => "Administrateur"); //Ce tableau associe numéro de droit et nom
                echo'<label>'.$data['membre_pseudo'].'</label>';
                echo'<select name="droits">';
                for($i=0;$i<5;$i++)
                {
                if ($i == $data['membre_rang'])
                {
                echo'<option value="'.$i.'"
                selected="selected">'.$rang[$i].'</option>';
                }
                else
                {
                echo'<option value="'.$i.'">
                '.$rang[$i].'</option>';
                }
                }
                echo'</select>
                <input type="hidden" value="'.stripslashes($pseudo).'" name="pseudo">               
                <input type="submit" value="Envoyer"></form>';
                }
                else echo' <p>Erreur : Ce membre n existe pas, <br />
                cliquez <a href="./admin.php?cat=membres&amp;action=edit">ici</a> 
                pour réessayer</p>';
        }
        break;
?>


Un peu étrange ce code, je vous l'accorde : on va donc voir ça tout en douceur. Tout d'abord on crée le tableau, celui-ci associe, comme je l'ai dit plus haut, un numéro avec le nom qu'il représente. Ensuite, il faut faire la boucle qui affiche l'option de la liste déroulante, et c'est grâce à la variable $i que l'on va pouvoir savoir quelle option mettre en "selected".

Un truc peut vous paraitre mauvais, le tableau qu'il faudra modifier dès qu'on voudra ajouter un rang. C'est pourquoi je vous conseille d'utiliser la méthode expliquée ici, le tableau est alors tout beau, et prêt à être utilisé grâce à la table forum_groupes.

Bannissement



Pour ce qui est du bannissement, vous avez certainement remarqué qu'il est possible de bannir un membre en modifiant ses droits et en mettant 0. Toutefois, pour des raisons pratiques, il est possible en effet que vous n'ayez pas suivi mes idées à la lettre, et que vous gériez le bannissement autrement ; nous allons tout de suite voir une autre méthode. De plus, il sera beaucoup plus clair d'afficher la liste de tous les membres bannis pour que vous puissiez réhabiliter celui que vous voulez :p .

Voilà ce que l'on va faire :
- en haut, un formulaire propose à l'admin d'entrer le pseudo du membre à bannir
- en bas, la liste de tous les membres bannis avec l'option débannir.

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
<?
case "ban":
        //Bannissement
        echo'<h1>Gestion du bannissement</h1>'; 

        //Zone de texte pour bannir le membre
        echo'Quel membre voulez-vous bannir ?<br />';
        echo'<br />
        <form method="post" action="./adminok.php?cat=membres&amp;action=ban">
        <label for="membre">Inscrivez le pseudo : </label> 
        <input type="text" id="membre" name="membre"><br />';

        //Ici, on boucle : pour chaque membre banni, on affiche une checkbox
        //Qui propose de le débannir
        $requete_bannissement = mysql_query('SELECT membre_id, membre_pseudo 
        FROM forum_membres WHERE membre_rang = 0');
        
        //Bien sur, on ne lance la suite que s'il y a des membres bannis !
        if (mysql_num_rows($requete_bannissement) > 0)
        {
                while($data = mysql_fetch_assoc($requete_bannissement))
                {
                echo'<br />
<label><a href="./voirprofil.php?action=consulter&amp;m='.$data['membre_id'].'">
                '.stripslashes(htmlspecialchars($data['membre_pseudo'])).'</a></label>
                <input type="checkbox" name="'.$data['membre_id'].'" />
                Débannir<br />';
                }
                echo'<p><input type="submit" value="Go !" /></p></form>';
        }
        else echo' <p>Aucun membre banni pour le moment :p</p>';
        break;
?>


Le code n'est pas bien compliqué : on affiche finalement encore une fois un formulaire. Le gros avantage de cette méthode est que vous pouvez d'un coup bannir un membre, et en débannir autant que vous voulez.

Bon, on a fait le tour de l'administration des membres ; pour le coup, je ne vois pas ce qu'on pourrait ajouter... Mais de toute façon, si vous avez une idée, il ne vous reste qu'à l'ajouter :p .

Bon, bah on y est arrivés :p : on a maintenant un panneau d'administration qui prend forme, avec toutes les fonctions que l'on va voir maintenant mises en place.

Avant de repartir, j'aimerais faire une remarque.
La page n'est pas complète, vous avez certainement remarqué qu'il manque à la fois le début et la fin. C'est parce qu'ils n'ont que peu d'intérêt. N'oubliez toutefois pas de réserver l'accès aux seuls administrateurs !

La suite ne sera qu'une adaptation de ce qu'on vient de voir... Il suffira de faire les bonnes requêtes, et le tour sera joué ! ^^ .

Allez : on y va !
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 13/09/2006 à 19:48:41
Modifié : le 01/09/2008 à 23:08:45
Avancement : 100%
Licence : Creative Commons BY

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | 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 30 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0752s (0.0631s)