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

; 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 | <?php
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")
{
$query=$db->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" name="nom" /><br /><br />
<label>Description :</label>
<textarea cols=40 rows=4 name="desc" id="desc"></textarea>
<br /><br />
<label>Catégorie : </label><select name="cat">';
while($data = $query->fetch())
{
echo'<option value="'.$data['cat_id'].'">'.$data['cat_nom'].'</option>';
}
echo'</select><br /><br />
<input type="submit" value="Envoyer"></form>';
$query->CloseCursor();
}
//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 | <?php
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&e=editf">
Editer un forum</a><br />
<a href="./admin.php?cat=forum&action=edit&e=editc">
Editer une catégorie</a><br />
<a href="./admin.php?cat=forum&action=edit&e=ordref">
Changer l ordre des forums</a><br />
<a href="./admin.php?cat=forum&action=edit&e=ordrec">
Changer l ordre des catégories</a>
<br /></p>';
}
?>
|
Comme d'habitude, en fait

. 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
72 | <?php
elseif($_GET['e'] == "editf")
{
//On affiche dans un premier temps la liste des forums
if(!isset($_POST['forum']))
{
$query=$db->query('SELECT forum_id, forum_name
FROM forum_forum ORDER BY forum_ordre DESC');
echo'<form method="post" action="admin.php?cat=forum&action=edit&e=editf">';
echo'<p>Choisir un forum :</br /></h2>
<select name="forum">';
while($data = $query->fetch())
{
echo'<option value="'.$data['forum_id'].'">
'.stripslashes(htmlspecialchars($data['forum_name'])).'</option>';
}
echo'<input type="submit" value="Envoyer"></p></form>';
$query->CloseCursor();
}
//Ensuite, on affiche les renseignements sur le forum choisi
else
{
$query = $db->prepare('SELECT forum_id, forum_name, forum_desc,
forum_cat_id
FROM forum_forum
WHERE forum_id = :forum');
$query->bindValue(':forum',(int) $_POST['forum'],PDO::PARAM_INT);
$query->execute();
$data1 = $query->fetch();
echo'<p>Edition du forum
<strong>'.stripslashes(htmlspecialchars($data1['forum_name'])).'</strong></p>';
echo'<form method="post" action="adminok.php?cat=forum&action=edit&e=editf">
<label>Nom du forum : </label><input type="text" id="nom"
name="nom" value="'.$data1['forum_name'].'" />
<br />
<label>Description :</label><textarea cols=40 rows=4 name="desc"
id="desc">'.$data1['forum_desc'].'</textarea><br /><br />';
$query->CloseCursor();
//A partir d'ici, on boucle toutes les catégories,
//On affichera en premier celle du forum
$query = $db->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 = $query->fetch())
{
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>';
$query->CloseCursor();
}
}
?>
|
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
39 | <?php
elseif($_GET['e'] == "editc")
{
//On commence par afficher la liste des catégories
if(!isset($_POST['cat']))
{
$query = $db->query('SELECT cat_id, cat_nom
FROM forum_categorie ORDER BY cat_ordre DESC');
echo'<form method="post" action="admin.php?cat=forum&action=edit&e=editc">';
echo'<p>Choisir une catégorie :</br />
<select name="cat">';
while($data = $query->fetch())
{
echo'<option value="'.$data['cat_id'].'">'.$data['cat_nom'].'</option>';
}
echo'<input type="submit" value="Envoyer"></p></form>';
$query->CloseCursor();
}
//Puis le formulaire
else
{
$query = $db->prepare('SELECT cat_nom FROM forum_categorie
WHERE cat_id = :cat');
$query->bindValue(':cat',(int) $_POST['cat'],PDO::PARAM_INT);
$query->execute();
$data = $query->fetch();
echo'<form method="post" action="./adminok.php?cat=forum&action=edit&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>';
$query->CloseCursor();
}
}
?>
|
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 | <?php
elseif($_GET['e'] == "ordref")
{
$categorie="";
$query = $db->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&action=edit&e=ordref">';
echo '<table>';
while($data = $query->fetch())
{
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 | <?php
elseif($_GET['e'] == "ordrec")
{
$query = $db->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&action=edit&e=ordrec">';
while($data = $query->fetch())
{
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>';
$query->CloseCursor();
}
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
68
69
70 | <?php
case "droits":
//Gestion des droits
echo'<h1>Edition des droits</h1>';
if(!isset($_POST['forum']))
{
$query=$db->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 = $query->fetch())
{
echo'<option value="'.$data['forum_id'].'">'.$data['forum_name'].'</option>';
}
echo'<input type="submit" value="Envoyer"></p></form>';
$query->CloseCursor();
}
else
{
$query = $db->prepare('SELECT forum_id, forum_name, auth_view,
auth_post, auth_topic, auth_annonce, auth_modo
FROM forum_forum WHERE forum_id = :forum');
$query->bindValue(':forum',(int) $_POST['forum'], PDO::PARAM_INT);
$query->execute();
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 = $query->fetch();
//Ces deux tableaux vont permettre d'afficher les résultats
$rang = array(
VISITEUR=>"Visiteur",
INSCRIT=>"Membre",
MODO=>"Modérateur",
ADMIN=>"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=1;$i<5;$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>';
$query->CloseCursor();
}
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...
