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)
Avant de se lancer corps et âmes dans les codes, voyons plutôt ce que l'on veut réaliser.
Éditer un message
Dans la page voirtopic.php, sur chaque post, il doit être possible si l'on est modérateur, administrateur ou simplement le créateur du message de le modifier.
Pour cela, nous allons mettre une petite image
édition qui renverra à la page poster.php. Finalement, ça sera assez similaire au script pour poster une réponse, sauf que dans la zone de texte, on écrira le message à éditer.
Supprimer un message
Je passe rapidement là-dessus : tout comme il est possible de modifier un de ses messages, il est normal que l'on puisse le supprimer. A côté du bouton 'édition', il y aura un bouton suppression dont je vous laisse deviner l'action.
Supprimer un topic
Si on veut y aller carrément, il faut aussi prévoir une suppression de tout le topic

. On ajoute donc une option pour cela dans la page voirtopic.php.
En général, cette option ne peut être utilisée que par les modérateurs, le créateur du topic n'a pas ce droit ; cela dit, vous faites comme vous voulez sur votre forum

.
Déplacer un topic
Voilà une option plus intéressante : la possibilité de pouvoir déplacer un topic vers un autre forum. Encore une fois, seuls les modérateurs peuvent faire ceci. Il va falloir ajouter une liste déroulante à la page voirtopic.php qui affichera tous les forums vers lesquels on peut envoyer le topic.
Verrouiller un topic
Un modérateur a également la possibilité de verrouiller ou de déverrouiller un topic, si jamais celui-ci tourne mal. Pour cela, encore un bouton / lien dans la page voirtopic.php

.
Il faudra aussi penser à changer un peu la page voirforum.php, en mettant une icône spéciale si le topic est verrouillé.
Verrouiller / Déverrouiller un topic nécessite l'ajout d'un champ dans la table forum_topic (je l'ai appelé topic_locked, et il peut prendre les valeurs 1 ou 0).
Voici la requête :
Code : SQL1 | ALTER TABLE `forum_topic` ADD `topic_locked` ENUM( '0', '1' ) NOT NULL AFTER `topic_post` ;
|
Voilà les fonctions qu'il va falloir réaliser dans ce tp ; avant que je vous lâche en pleine nature, nous allons voir quelques conseils.
Normalement, vous n'avez pas besoin de créer une nouvelle page pour réaliser le système de modération.
Le code que vous allez écrire se situera dans les pages poster.php, postok.php et voirtopic.php. En fait, il suffira d'ajouter une option à votre switch déjà bien garni sur les pages poster.php et postok.php.
La chose la plus importante de votre script sera de bien vérifier les permissions. Vous venez de régler tout ce qu'il faut sur la question dans le chapitre précédent. Si vous vous souvenez, le seul champ que l'on a pas utilisé est
auth_modo, il suffit donc de faire ceci avant de commencer quoi que ce soit.
Code : PHP1
2
3
4 | <?
if (verif_auth($data1['auth_modo']))
{
?>
|
Ne pas afficher le bouton / lien vers une page ne suffit en aucun cas à sécuriser son accès, vous allez devoir faire la même vérification sur la page ciblée par le lien.
Pour ce qui est de la suppression et de l'édition, je pense que ça vous sera assez facile. Pour la suppression, vous pouvez vous baser sur le système de MP vu précédemment. Quant à l'édition, c'est exactement le même principe que celui utilisé pour modifier son profil, sauf qu'on s'en sert ici pour un message

.
Un mot sur le déplacement
Déplacer un topic doit vous paraître assez difficile à réaliser : pourtant, ça sera sûrement le plus facile. Il faut que grâce à une boucle vous récupériez les id et les noms des forums qui ne sont pas ceux du topic sur lequel on se trouve.
Code : SQL1 | SELECT forum_id, forum_name FROM forum_forum WHERE forum_id <> X
|
Je rappelle que le
<> est équivalent au
!=, mais pour les bases de données, il faut utiliser
<> (cela dit, mysql comprend les 2).
A la place de X, vous mettrez l'id du forum actuel. Ensuite, grâce à une boucle, vous listez les forums obtenus par la requête (vous pouvez même les regrouper par catégorie en utilisant la balise
<optgroup> 
).
Ensuite, vous faites un bouton envoyer qui mène à la page postok.php avec la valeur du forum sélectionné.
Et un mot sur le (dé)verrouillage
Le verrouillage de topic va sans doute vous arrêter un moment pour une raison simple : c'est qu'il faut modifier des tas de choses.
Déjà, pour la base de données :
Code : SQL1 | ALTER TABLE `forum_topic` ADD `topic_locked` enum('0','1') AFTER `topic_post`
|
1 signifie verrouillé, 0 signifie ouvert ; grâce à ces valeurs, il va être facile de distinguer les cas et d'afficher une icône en fonction.
Reprenons la requête de la page voirforum.php.
Code : PHP1
2
3
4
5
6
7
8 | <?
$requete3 = mysql_query('SELECT forum_topic.topic_id, topic_titre, topic_createur, topic_vu, topic_post, topic_time, topic_last_post,
Mb.membre_pseudo AS membre_pseudo_createur, post_createur, post_time, Ma.membre_pseudo AS membre_pseudo_last_posteur FROM forum_topic
LEFT JOIN forum_membres Mb ON Mb.membre_id = forum_topic.topic_createur
LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
LEFT JOIN forum_membres Ma ON Ma.membre_id = forum_post.post_createur
WHERE topic_genre = "Annonce" AND forum_topic.forum_id = "'.$forum.'" ORDER BY topic_last_post DESC');
?>
|
Ah, souvenirs ...

Enfin, quoiqu'il en soit, il va falloir ajouter
forum_topic.topic_locked dans les champs à retourner. Ensuite, un simple
if permettra de modifier l'image.
Un tout petit mot sur l'édition
Je sais que j'ai dit plus haut que ça serait simple mais je vais quand même vous indiquer comment faire pour écrire un lien pointant directement vers le post édité.
Dans le cas d'une réponse c'est simple puisqu'il s'agit forcément du dernier post envoyé donc pour obtenir la page il suffit de prendre la dernière.
Ici c'est un peu différent, alors on est obligé de compter... et bien comptons
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | <?
//Cette requête va récupérer le nombre de posts avant celui que vous éditez
$requete = mysql_query('SELECT COUNT(*) AS nbr FROM forum_post
WHERE topic_id = '.$topic.' AND post_time < LE POST_TIME DU MESSAGE');
$data = mysql_fetch_assoc($requete);
//Les 3 lignes habituelles
$nombreDeMessagesParPage = 15;
$nbr_post = $data['nbr']+1;
$page = ceil($nbr_post / $nombreDeMessagesParPage);
echo'<p>Votre message a bien été édité!<br /><br />
Cliquez <a href="./voirtopic.php?t='.$topic.'&page='.$page.'#p_'.$post.'">ici</a> pour le voir</p>';
?>
|
Et voilà ça devrait marcher.
Une dernière chose importante !
Pour qu'il n'y ait pas de problème, il faut que vous pensiez à tout ce que pourrait impliquer la suppression d'un topic ou son déplacement. Par exemple, lorsque sur la page d'index, vous lisez 203 messages dans un forum, il ne faut pas oublier d'enlever un à cette valeur si vous avez décidé d'y enlever un post.
Voilà, normalement vous êtes parés pour commencer : je vais alors aller lire le journal, tchao !
Euh... T'es là ?
Quoi, déjà ?
Bon bah, voyons ensemble le résultat : je vous rappelle que vous ne pouvez pas encore promouvoir des membres modérateurs, donc il faut le faire en passant par la base de données (ce n'est qu'une question de temps pour que l'on y arrive

).
Allez, on commence tout de suite avec l'édition de message !
Si vous n'avez pas réussi à réaliser ces systèmes, il serait plus bénéfique que vous essayiez de comprendre vos erreurs grâce à mes scripts, plutôt que de laisser complètement tomber ce que vous avez fait.
En tout cas, ne faites pas de copier / coller aveugle, et n'oubliez pas qu'un forum est là pour vous aider !
Éditer un message
Si vous avez bien suivi tout ce qui a été vu jusqu'ici, ça n'a pas dû vous poser trop de difficultés

.
Page poster.php
Déjà le code dans la page poster.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
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 | <?php
case "edit": //Si on veut éditer le post
//On récupère la valeur de p
$post = (int) $_GET['p'];
echo'<h1>Edition</h1>';
//On lance enfin notre requête
$requete2 = mysql_query('
SELECT post_createur, post_texte, auth_modo
FROM forum_post
LEFT JOIN forum_forum ON forum_post.post_forum_id = forum_forum.forum_id
WHERE post_id='.$post.'');
$data2 = mysql_fetch_assoc($requete2);
$text_edit = $data2['post_texte'];
//on utilise la fonction créée dans le fichier fonction (pensez à l'inclure)
//Ensuite on vérifie que le membre a le droit d'être ici (soit le créateur soit un modo/admin)
if (!verif_auth($data2['auth_modo']) && $data2['post_createur'] != $_SESSION['id'] )
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on affiche la suite
{
//Le formulaire de postage
?>
<form method="post" action="postok.php?action=edit&p=<?php echo $post ?>" name="formulaire">
<fieldset><legend>Mise en forme</legend>
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />
<input type="button" id="italic" name="italic" value="Italic" onClick="javascript:bbcode('[i]', '[/i]');return(false)" />
<input type="button" id="souligné" name="souligné" value="Souligné" onClick="javascript:bbcode('[s]', '[/s]');return(false)" />
<input type="button" id="lien" name="lien" value="Lien" onClick="javascript:bbcode('[url]', '[/url]');return(false)" />
<br /><br />
<img src="./images/smileys/heureux.gif" title="heureux" alt="heureux" onClick="javascript:smilies(':D');return(false)" />
<img src="./images/smileys/lol.gif" title="lol" alt="lol" onClick="javascript:smilies(':lol:');return(false)" />
<img src="./images/smileys/triste.gif" title="triste" alt="triste" onClick="javascript:smilies(':triste:');return(false)" />
<img src="./images/smileys/cool.gif" title="cool" alt="cool" onClick="javascript:smilies(':frime:');return(false)" />
<img src="./images/smileys/rire.gif" title="rire" alt="rire" onClick="javascript:smilies('XD');return(false)" />
<img src="./images/smileys/confus.gif" title="confus" alt="confus" onClick="javascript:smilies(':s');return(false)" />
<img src="./images/smileys/choc.gif" title="choc" alt="choc" onClick="javascript:smilies(':O');return(false)" />
<img src="./images/smileys/question.gif" title="?" alt="?" onClick="javascript:smilies(':interrogation:');return(false)" />
<img src="./images/smileys/exclamation.gif" title="!" alt="!" onClick="javascript:smilies(':exclamation:');return(false)" /></fieldset>
<fieldset><legend>Message</legend><textarea cols="80" rows="8" id="message" name="message">
<?php echo $text_edit ?>
</textarea></fieldset>
<p>
<input type="submit" name="submit" value="Editer !" />
<input type="reset" name = "Effacer" value = "Effacer"/></p>
</form>
<?php
}
break; //Fin de ce cas :o
?>
|
Ce code doit être écrit dans le switch de la page poster.php.
Ce que l'on fait ici, c'est simplement relancer le formulaire pour poster, mais on pré-remplit la case message avant au final

.
Vous devez aussi modifier le haut de la page poster.php, en effet les droits d'accès dans le cas de la modération sont valables pour le modérateur et le créateur du message, il faut donc rajouter cette vérification.
Passons au traitement du message :
Page postok.php
Ce code est assez court, assez simple et en plus, il ressemble au précédent
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 | <?php
case "edit": //Si on veut éditer le post
//On récupère la valeur de p
$post = (int) $_GET['p'];
//On check le message
$message = mysql_real_escape_string($_POST['message']);
//Ensuite on vérifie que le membre a le droit d'être ici (soit le créateur soit un modo/admin)
$requete2 = mysql_query('
SELECT post_createur, post_texte, post_time, topic_id, auth_modo
FROM forum_post
LEFT JOIN forum_forum ON forum_post.post_forum_id = forum_forum.forum_id
WHERE post_id='.$post.'');
$data2 = mysql_fetch_assoc($requete2);
$topic = $data2['topic_id'];
//On récupère la place du message dans le topic (pour le lien)
$requete3 = mysql_query('SELECT COUNT(*) AS nbr FROM forum_post
WHERE topic_id = '.$topic.' AND post_time < '.$data2['post_time']);
$data3 = mysql_fetch_assoc($requete3);
if (!verif_auth($data2['auth_modo'])&& $data2['post_createur'] != $_SESSION['id'])
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on continue
{
mysql_query("UPDATE forum_post SET post_texte = '".$message."' WHERE post_id = '".$post."'");
$nombreDeMessagesParPage = 15;
$nbr_post = $data3['nbr']+1;
$page = ceil($nbr_post / $nombreDeMessagesParPage);
echo'<p>Votre message a bien été édité!<br /><br />
Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum<br />
Cliquez <a href="./voirtopic.php?t='.$topic.'&page='.$page.'#p_'.$post.'">ici</a> pour le voir</p>';
}
break;
?>
|
Voilà pour ce qui est de l'édition. Quand tout est terminé, on affiche un message pour annoncer la bonne nouvelle.
Quant à l'affichage du lien vers le dernier message, il est un peu étrange. En fait la difficulté est que le message édité n'est pas forcément le dernier du topic, il faut donc calculer sa place pour ensuite connaitre la page et enfin mettre le bon lien.
Supprimer
On passe au système suivant, la suppression d'un post et d'un topic. C'est à peu de choses près le même script que celui de la suppression d'un mp.
Page poster.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 | <?php
case "delete": //Si on veut supprimer le post
//On récupère la valeur de p
$post = (int) $_GET['p'];
//Ensuite on vérifie que le membre a le droit d'être ici
echo'<h1>Suppression</h1>';
$requete2 = mysql_query('
SELECT post_createur, auth_modo
FROM forum_post
LEFT JOIN forum_forum ON forum_post.post_forum_id = forum_forum.forum_id
WHERE post_id='.$post.'');
$data2 = mysql_fetch_assoc($requete2);
if (!verif_auth($data2['auth_modo']) && $data2['post_createur'] != $_SESSION['id'])
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on affiche la suite
{
echo'<p>Êtes vous certains de vouloir supprimer ce post ?</p>';
echo'<p><a href="./postok.php?action=delete&p='.$post.'">Oui</a> ou <a href="./index.php">Non</a></p>';
}
break;
?>
|
On retrouve beaucoup de similitudes avec la partie édition dans la vérification des droits du membre. Vous voyez par ailleurs que cette fois, on demande de confirmer la suppression avant de tout envoyer aux oubliettes.
Page postok.php
Il ne reste plus qu'à traiter le message, en le supprimant sans pitié.
Eh, mais attends

! Comment on fait si c'est le premier post ou le dernier post d'un topic, faudra changer la valeur de
topic_last_post et
topic_first_post 
?
En fait pas tout à fait, c'est là qu'est la petite difficulté. Je m'explique : imaginez qu'on essaye de supprimer le premier post d'un topic. Si on laisse le topic en vie, ça ne va pas le faire... Il faudra donc le supprimer lui aussi. Et si on essaye de supprimer le dernier, il faudra ne pas oublier de mettre à jour la valeur de
topic_last_post !
Puis il faudra aussi baisser la valeur de
topic_post et de
forum_post, et mettre à jour
forum_last_post_id.
Bon bah au final, ça fait un code assez compliqué, tout ça ...
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153 | <?php
case "delete": //Si on veut supprimer le post
//On récupère la valeur de p
$post = (int) $_GET['p'];
$requete1 = mysql_query('
SELECT post_createur, post_texte, forum_id, topic_id, auth_modo
FROM forum_post
LEFT JOIN forum_forum ON forum_post.post_forum_id = forum_forum.forum_id
WHERE post_id='.$post.'');
$data1 = mysql_fetch_assoc($requete1);
$topic = $data1['topic_id'];
$forum = $data1['forum_id'];
//Ensuite on vérifie que le membre a le droit d'être ici
//(soit le créateur soit un modo/admin)
if (!verif_auth($data1['auth_modo']))
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on continue
{
//Ici on vérifie plusieurs choses :
//est-ce un premier post ? Dernier post ou post classique ?
$requete_first_post = mysql_query("SELECT COUNT(*)
AS first_post
FROM forum_topic
WHERE topic_first_post = $post");
$requete_last_post = mysql_query("SELECT COUNT(*)
AS last_post
FROM forum_topic
WHERE topic_last_post = $post");
$first_post = mysql_fetch_assoc($requete_first_post);
$last_post = mysql_fetch_assoc($requete_last_post);
//On distingue maintenant les cas
if ($first_post['first_post'] != 0)
//Si le message est le premier
{
//Les autorisations ont changé !
if (!verif_auth($data1['auth_modo']))
{
echo'<p>
Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
//Il faut s'assurer que ce n'est pas une erreur
echo'<p>Vous avez choisi de supprimer un post.
Cependant ce post est le premier du topic.
Voulez vous supprimer le topic ? <br />
<a href="./postok.php?action=delete_topic&t='.$topic.'">oui</a>
- <a href="./voirtopic.php?t='.$topic.'">non</a></p>';
}
elseif ($last_post['last_post'] != 0)
//Si le message est le dernier
{
//On supprime le post
mysql_query("DELETE FROM forum_post
WHERE post_id = '".$post."'");
//On modifie la valeur de topic_last_post pour cela on
//récupère l'id du plus récent message de ce topic
$requete4 = mysql_query('SELECT post_id
FROM forum_post
WHERE topic_id = '.$topic.'
ORDER BY post_id DESC
LIMIT 0,1');
$data4 = mysql_fetch_assoc($requete4);
//On fait de même pour forum_last_post_id
$requete5 = mysql_query('SELECT post_id
FROM forum_post
WHERE post_forum_id = '.$forum.'
ORDER BY post_id DESC
LIMIT 0,1');
$data5 = mysql_fetch_assoc($requete5);
//On met à jour la valeur de topic_last_post
mysql_query("UPDATE forum_topic
SET topic_last_post = $data4['post_id']
WHERE topic_last_post = $post");
//On enlève 1 au nombre de messages du forum et on met à
//jour forum_last_post
mysql_query("UPDATE forum_forum
SET forum_post = forum_post - 1,
forum_last_post_id = $data5['post_id']
WHERE forum_id = $forum");
//On enlève 1 au nombre de messages du topic
mysql_query("UPDATE forum_topic
SET topic_post = topic_post - 1
WHERE topic_id = $topic");
//On enlève 1 au nombre de messages du membre
mysql_query("UPDATE forum_membres
SET membre_post = membre_post - 1
WHERE membre_id = $data1['post_createur']");
//Enfin le message
echo'<p>Le message a bien été supprimé !<br />
Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a>
pour retourner au topic<br />
Cliquez <a href="./index.php">ici</a>
pour revenir à l index du forum</p>';
}
elseif ($last_post['last_post'] == 0
&& $first_post['first_post'] == 0) // Si c'est un post classique
{
//On supprime le post
mysql_query("DELETE FROM forum_post
WHERE post_id = $post");
//On enlève 1 au nombre de messages du forum
mysql_query("UPDATE forum_forum
SET forum_post = forum_post - 1
WHERE forum_id ='".$forum."'");
//On enlève 1 au nombre de messages du topic
mysql_query("UPDATE forum_topic
SET topic_post = topic_post - 1
WHERE topic_id = $topic");
//On enlève 1 au nombre de messages du membre
mysql_query("UPDATE forum_membres
SET membre_post = membre_post - 1
WHERE membre_id = $data1['post_createur']");
//Enfin le message
echo'<p>Le message a bien été supprimé !<br />
Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a> pour retourner au topic<br />
Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum</p>';
}
}
break;
?>
|
Il faut distinguer les trois cas, ensuite on peut agir en fonction. De toute façon, il faudra toujours faire attention à ce genre de détails lorsque l'on travaillera sur les pages d'administration. Les tables sont liées entre elles par des valeurs comme
topic_last_post, par exemple, il est important de penser à mettre celles-ci à jour également pour ne pas rompre la relation

.
Concernant la suppression d'un topic
Vous avez sûrement remarqué une chose assez étrange : si l'on décide de supprimer le premier post, j'avais dit qu'il fallait supprimer tout le topic. Mais alors pourquoi on ne le fait pas directement ? C'est une question de clarté, et puis ça permet d'éviter de virer un topic entier par erreur

. Ce qu'on fait alors, c'est qu'on redemande si c'est bien le topic qu'il faut supprimer ? Si oui, on va voir ce qu'il se passe, si non, on a eu chaud et on revient en arrière

.
Voici donc la fin du 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
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 | <?php
case "delete_topic":
$topic = (int) $_GET['t'];
$requete1 = mysql_query('
SELECT forum_topic.forum_id, auth_modo
FROM forum_topic
LEFT JOIN forum_forum ON forum_topic.forum_id = forum_forum.forum_id
WHERE topic_id='.$topic.'');
$data1 = mysql_fetch_assoc($requete1);
$forum = $data1['forum_id'];
//Ensuite on vérifie que le membre a le droit d'être ici
//c'est-à-dire si c'est un modo / admin
if (!verif_auth($data1['auth_modo']))
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on continue
{
//On compte le nombre de post du topic
$requete_count_post = mysql_query("SELECT COUNT(*)
AS nombre_post
FROM forum_post
WHERE topic_id = $topic");
$data_nombrepost = mysql_fetch_assoc($requete_count_post);
$nombrepost = $data_nombrepost['nombre_post'];
//On supprime le topic
mysql_query("DELETE FROM forum_topic
WHERE topic_id = $topic");
//On enlève le nombre de post posté par chaque membre dans le topic
$requete_postparmembre = mysql_query('SELECT post_createur,
COUNT(*) AS nombre_mess
FROM forum_post
WHERE topic_id = '.$topic.'
GROUP BY post_createur');
while($data_postparmembre = mysql_fetch_assoc($requete_postparmembre))
{
mysql_query("UPDATE forum_membres
SET membre_post = membre_post - $data_postparmembre['nombre_mess']
WHERE membre_id = $data_postparmembre['post_createur']");
}
//Et on supprime les posts !
mysql_query("DELETE FROM forum_post
WHERE topic_id = $topic");
//Dernière chose, on récupère le dernier post du forum
$requete_forum = mysql_query('SELECT post_id
FROM forum_post
WHERE post_forum_id = '.$forum.'
ORDER BY post_id DESC
LIMIT 0,1');
$data_forum = mysql_fetch_assoc($requete_forum);
//Ensuite on modifie certaines valeurs :
mysql_query("UPDATE forum_forum
SET forum_topic = forum_topic - 1,
forum_post = forum_post - $nombrepost,
forum_last_post_id = $data_forum['post_id']
WHERE forum_id = $forum");
//Enfin le message
echo'<p>Le topic a bien été supprimé !<br />
Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum</p>';
}
break;
?>
|
Et là, c'est gagné. Du coup si vous avez suivi, il est très facile de faire un lien pour supprimer directement tout le topic (lien que vous pouvez placer dans la page voirtopic, par exemple

).
Retour sur la modification du nombre de post
J'aimerais revenir sur ce morceau de code :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
//On enlève le nombre de post posté par chaque membre dans le topic
$requete_postparmembre = mysql_query('SELECT post_createur,
COUNT(*) AS nombre_mess
FROM forum_post
WHERE topic_id = '.$topic.'
GROUP BY post_createur');
while($data_postparmembre = mysql_fetch_assoc($requete_postparmembre))
{
mysql_query("UPDATE forum_membres
SET membre_post = membre_post - '".$data_postparmembre['nombre_mess']."'
WHERE membre_id = '".$data_postparmembre['post_createur']."'");
}
?>
|
Ici, on veut soustraire à la valeur de
membre_post (nombre de posts d'un membre) le nombre de messages qu'il a laissé dans le topic que l'on supprime. Ça peut paraître simple, mais en fait on est obligé de faire une requête dans une boucle (berk

).
Du coup, grâce à une boucle, on retourne pour chaque membre qui a posté le nombre de messages qu'il a laissé. Ça limite un peu le nombre de requêtes ; cela dit, il est assez rare de supprimer un topic, en général, on le déplace dans un forum "poubelle".
Verrouillons !
Ce système de verrouillage / déverrouillage va se faire sur une simple requête sql. Celle-ci retourne la valeur de la case
topic_locked : si c'est 1, je rappelle que c'est verrouillé, on proposera alors de déverrouiller. Si c'est 0, le topic est ouvert, on propose alors de le verrouiller. Ça va, vous me suivez ?
En plus, comble du bonheur, on n'aura qu'une seule page à modifier.
Codons !
En fait, j'ai dit 1 page, mais j'ai menti

. C'est-à-dire que c'est dans la page voirtopic.php qu'il faut faire la requête qui va nous donner la valeur de
topic_locked. Ainsi, on fera deux liens selon les cas vers la page postok.php.
Enfin, voyez plutôt

:
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | <?php
$requete3 = mysql_query('SELECT topic_locked FROM forum_topic WHERE topic_id = '.$topic);
$data3 = mysql_fetch_assoc($requete3);
if ($data3['topic_locked'] == 1) // Topic verrouillé !
{
echo'<a href="./postok.php?action=unlock&t='.$amp;topic.'">
<img src="./images/unlock.gif" alt="deverrouiller"
title="Déverrouiller ce sujet" /></a>';
}
else //Sinon le topic est déverrouillé !
{
echo'<a href="./postok.php?action=lock&t='.$topic.'">
<img src="./images/lock.gif" alt="verrouiller"
title="Verrouiller ce sujet" /></a>';
}
?>
|
Tout simplement

. Vous pouvez insérer ceci où vous voulez dans la page voirtopic.php, mais je vous conseille de le mettre en bas (à côté du numéro des pages) dans un endroit où vous mettrez toutes les options de modération (suppression du topic, verrouillage et déplacement).
Je ne l'ai pas mis parce que normalement vous l'avez fait au moment d'afficher le bouton de suppression du topic : mais pensez à vérifier les autorisations avant !
Passons à la page postok.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
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 | <?php
case "lock": //Si on veut verrouiller le topic
//On récupère la valeur de t
$topic = (int) $_GET['t'];
$requete1 = mysql_query('
SELECT forum_topic.forum_id, auth_modo
FROM forum_topic
LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id
WHERE topic_id = '.$topic);
$data1 = mysql_fetch_assoc($requete1);
//Ensuite on vérifie que le membre a le droit d'être ici
if (!verif_auth($data1['auth_modo']))
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on continue
{
//On met à jour la valeur de topic_locked
mysql_query("UPDATE forum_topic
SET topic_locked = '1'
WHERE topic_id = '".$topic."'");
echo'<p>Le topic a bien été verrouillé ! <br />
Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a> pour retourner au topic<br />
Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum</p>';
}
break;
case "unlock": //Si on veut déverrouiller le topic
//On récupère la valeur de t
$topic = (int) $_GET['t'];
$requete1 = mysql_query('
SELECT forum_topic.forum_id, auth_modo
FROM forum_topic
LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id
WHERE topic_id = '.$topic.'');
$data1 = mysql_fetch_assoc($requete1);
//Ensuite on vérifie que le membre a le droit d'être ici
if (!verif_auth($data1['auth_modo']))
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on continue
{
//On met à jour la valeur de topic_locked
mysql_query("UPDATE forum_topic
SET topic_locked = '0'
WHERE topic_id = '".$topic."'");
echo'<p>Le topic a bien été déverrouillé !<br />
Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a> pour retourner au topic<br />
Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum</p>';
}
break;
?>
|
Un simple
update, et le tour est joué !
Ouais, c'est cool ton truc, mais pour l'instant, ça sert à quoi que le champ
topic_locked soit sur
verrouillé puisque ça ne nous empêche pas de poster

?
En effet, pour l'instant c'est plus pour le style, mais ça n'empêche personne de poster un message

. Bah, ce n'est pas grave, remontez dans votre page postok.php, vous avez une des premières valeurs possibles de
$action qui est
repondre. C'est ici et
ici seulement qu'il faut faire agir le verrouillage.
Vous avez normalement quelque chose qui ressemble à ceci :
Code : PHP1
2
3
4
5
6
7
8
9 | <?php
case "repondre":
//On passe le message dans une série de fonction
$message = mysql_real_escape_string($_POST['message']);
//ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable t
$topic = (int) $_GET['t'];
?>
|
Il suffit de rajouter au-dessous le code suivant :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
$requete = mysql_query('SELECT topic_locked FROM forum_topic WHERE topic_id = '.$topic);
$data = mysql_fetch_assoc($requete);
if ($data['topic_locked'] != 0)
{
echo'<p>Le topic est verrouillé!</p><p>Cliquez <a href="./index.php">ici</a>
pour revenir à l index du forum</p>
<p>Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a>
pour retourner au topic</p></div></body></html>';
exit();
}
?>
|
Et le tour est joué !

Pensez cependant aussi à préciser que le topic est verrouillé sur les pages voirtopic.php, et même voirforum.php, avec une icône spéciale, pourquoi pas

.
Vous avez à présent un système de verrouillage / déverrouillage pour les topics de votre forum. Nous allons maintenant voir comment faire pour déplacer un topic

.
Déplacement d'un topic
La correction touche à sa fin et je vois déjà vos mines réjouies... Donc, on va calmer ça tout de suite avec ce qui arrive

.
En fait, ce n'est rien de très compliqué : c'est juste différent de ce qu'on a fait jusqu'ici.
Afficher la liste des forums
Pour déplacer un topic, de quoi j'ai besoin ? D'un forum vers lequel l'envoyer, pardi ! Et comment je le choisis ? Avec une liste déroulante, par exemple

.
J'en ai déjà un peu parlé plus haut, donc on va voir cela plus concrètement.
Déjà, on va afficher cette liste sur la page voirtopic.php, tout en bas entre 'supprimer' et 'verrouiller' le topic. Pensez donc à vérifier encore une fois les autorisations (enfin vous n'avez besoin de le faire qu'une fois dans la page, hein ?

)
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | <?php
$requete = mysql_query('SELECT forum_id, forum_name FROM forum_forum WHERE forum_id <> '.$data1['forum_id'].'');
//Data 1 a été définie tout en haut de la page !
echo'<p>Déplacer vers :</p>
<form method="post" action=postok.php?action=deplacer&t='.$topic.'>
<select name="dest">';
while($data = mysql_fetch_assoc($requete))
{
echo'<option value='.$data['forum_id'].' id='.$data['forum_id'].'>'.$data['forum_name'].'</option>';
}
echo'
</select>
<input type="hidden" name="from" value='.$data1['forum_id'].'>
<input type="submit" name="submit" value="Envoyer" />
</form>';
?>
|
Vous remarquez que je passe plusieurs infos à la page postok.php. Déjà l'id du topic à déplacer, mais aussi le forum d'origine ainsi que la destination. Vous comprendrez mieux pourquoi dans 2 minutes

.
Voilà déjà la liste qui est faite

: ça devrait vous donner quelque chose comme ça :

.
Passons maintenant au code de la page postok.php (pour changer

).
Traitement
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 | <?php
case "deplacer":
$topic = (int) $_GET['t'];
$requete1 = mysql_query('
SELECT forum_topic.forum_id, auth_modo
FROM forum_topic
LEFT JOIN forum_forum
ON forum_forum.forum_id = forum_topic.forum_id
WHERE topic_id = '.$topic.'');
$data1 = mysql_fetch_assoc($requete1);
if (!verif_auth($data1['auth_modo']))
{
// Si cette condition n'est pas remplie ça va barder :o
echo'<p>Vous n\'avez aucun droit d\'être ici</p></div></body></html>';
exit();
}
else //Sinon ça roule et on continue
{
$destination = (int) $_POST['dest'];
$origine = (int ) $_POST['from'];
//On déplace le topic
mysql_query("UPDATE forum_topic
SET forum_id = '".$destination."'
WHERE topic_id = '".$topic."'")
or die ("Un problème est survenu lors du déplacement");
//On déplace les posts
mysql_query("UPDATE forum_post
SET post_forum_id = '".$destination."'
WHERE topic_id = '".$topic."'")
or die ("Un problème est survenu lors du déplacement");
//On s'occupe d'ajouter / enlever les nombres de post / topic aux
//forum d'origine et de destination
//Pour cela on compte le nombre de post déplacé
$post_number_requete = mysql_query("SELECT COUNT(*)
AS nombre_post
FROM forum_post
WHERE topic_id = '".$topic."'")
or die ("Un problème est survenu lors du déplacement");
$data_post_number = mysql_fetch_assoc($post_number_requete);
$nombrepost = $data_post_number['nombre_post'];
//Il faut également vérifier qu'on a pas déplacé un post qui été
//l'ancien premier post du forum (champ forum_last_post_id)
$requete1 = mysql_query('SELECT post_id
FROM forum_post
WHERE post_forum_id = '.$origine.'
ORDER BY post_id DESC
LIMIT 0,1')
or die ("Un problème est survenu lors du déplacement");
$data1 = mysql_fetch_assoc($requete1);
//Puis on met à jour le forum d'origine
mysql_query("UPDATE forum_forum
SET forum_post = forum_post - '".$nombrepost."',
forum_topic = forum_topic - 1,
forum_last_post_id = '".$data1['post_id']."'
WHERE forum_id = '".$origine."'");
//Avant de mettre à jour le forum de destination il faut
//vérifier la valeur de forum_last_post_id
$requete2 = mysql_query('SELECT post_id
FROM forum_post WHERE post_forum_id = '.$destination.'
ORDER BY post_id DESC
LIMIT 0,1')
or die ("Un problème est survenu lors du déplacement");
$data2 = mysql_fetch_assoc($requete2);
//Et on met à jour enfin !
mysql_query("UPDATE forum_forum
SET forum_post = forum_post + '".$nombrepost."',
forum_topic = forum_topic + 1,
forum_last_post_id = '".$data2['post_id']."'
WHERE forum_id = '".$destination."'")
or die ("Un problème est survenu lors du déplacement");
//C'est gagné ! On affiche le message
echo'<p>Le topic a bien été déplacé <br />
Cliquez <a href="./voirtopic.php?t='.$topic.'">ici</a>
pour revenir au topic<br />
Cliquez <a href="./index.php">ici</a>
pour revenir à l index du forum</p>';
}
break;
?>
|
Piuu... ça en fait des choses à modifier...

. C'était la difficulté majeure de ces codes, ne pas oublier de modifier un seul champ, car sinon, on a vite fait de se retrouver avec des problèmes sur son forum.
C'est ce qui fait le nombre assez élevé de requêtes : donc, il ne faut pas se perdre. N'hésitez pas à reprendre les codes, et ne les utilisez qu'une fois compris (je les ai piégés, et ils vont tout faire sauter, sinon

).
Comme je l'ai déjà dit, il existe autant de façons de créer un forum qu'il y a de codeurs php. C'est-à-dire que les choix que j'ai fait ne sont pas forcément les seuls possibles. Notamment concernant les champs qui lient certaines tables : il ne tient qu'à vous de les supprimer, et de les contourner avec une jointure lorsque vous en avez besoin, ce qui permet de passer plus vite ce genre de code en en faisant qu'un seul update.
En tout cas, la correction est terminée et par la même occasion, la partie modération !