Vous avez sûrement remarqué que, sur la plupart des forums, il existe des sessions réservés aux modérateurs et administrateurs, pour qu'ils puissent décider en paix des supplices qu'ils vont nous faire subir

. Vous vous dites peut-être que vous n'en voyez pas l'intérêt, et pourtant il est énorme : lorsque votre forum commence à prendre un peu d'importance, il est très utile de pouvoir communiquer avec le reste de l'équipe.
Si vous avez suivi le déroulement du tuto jusqu'ici, vous pouvez remarquer qu'en fait tout est déjà mis en place.
Petit retour en arrière
Si je vous parle des cinq colonnes qu'on n'a pas encore utilisés dans la table
forum_forum, vous me dites
auth_view,
auth_post,
auth_topic,
auth_annonce, et
auth_modo, bien sûr

. Je vous avais rapidement expliqué qu'ils permettaient de désigner quel groupe de membres a le droit de lire un forum, d'y poster un message ou un topic.
Vous vous souvenez aussi de la variable
$lvl, qui permet de connaître le niveau d'un visiteur (modérateur, administrateur ou membre).
Je pense que vous avez compris qu'en cumulant les deux, on peut faire des miracles.
Par exemple, si je veux qu'un forum puisse n'être vu que par les membres, mais que seuls les modérateurs puissent y poster un topic, et que seuls les administrateurs puissent y laisser un post (ne cherchez pas la logique

) il suffit de mettre les valeurs suivantes :
| Champ | Valeur | Alias |
|---|
| auth_view |
2 |
INSCRIT |
| auth_topic |
3 |
MODO |
| auth_post |
4 |
ADMIN |
Et puis le tour est joué !
Le problème
Il y a un problème (je vous dois bien ça

) : comment faire pour créer un forum visible par les modérateurs
et les administrateurs?
Eh bien en fait c'est la raison pour laquelle les champs
auth_bidule sont des entiers ; ce que l'on va faire, c'est attribuer un numéro pour chaque catégorie de membres (par exemple, 4 pour les admins), de façon à les classer par ordre d'importance. Ensuite, il suffit de vérifier si le niveau d'accès est supérieur au niveau nécessaire

.
La solution !
Pour vous montrer comment faire à l'avenir, je vais utiliser un petit exemple. Nous allons créer un forum de news, c'est-à-dire que :
- tous les visiteurs pourront le lire
- seuls les membres pourront y poster un message
- seuls les modérateurs pourront y poster un topic
- seuls les administrateurs pourront le modérer.
Sachant que quand je dis "seuls les membres", il ne faut pas penser que les modérateurs n'auront pas le droit de poster un message, il s'agit de l'exigence minimale.
Vous vous souvenez de la page constants.php ? Je vous avais dit d'y écrire les 4 lignes suivantes :
Code : PHP | <?php
define('VISITEUR',1);
define('INSCRIT',2);
define('MODO',3);
define('ADMIN',4);
?>
|
Et bien on a donc les correspondances qui suivent :
| Niveau | Autorisation |
|---|
| Visiteur |
1 |
| Inscrit |
2 |
| Modérateur |
3 |
| Administrateur |
4 |
Ensuite, il va falloir modifier plusieurs choses.
La base de données
La gestion des autorisations de chaque forum se fera à l'avenir via le panneau d'administration, mais en attendant, vous devez le faire manuellement. Nous allons donc modifier les champs de notre forum News.
Code : SQL | UPDATE forum_forum
SET auth_view = 1, auth_post = 2, auth_topic = 2, auth_annonce = 3, auth_modo = 4
WHERE forum_id = 2
|
Et si vous avez supprimé le forum depuis tout ce temps :
Code : SQL | INSERT INTO forum_forum ( forum_cat_id , forum_name , forum_desc , forum_ordre , forum_last_post_id , forum_topic , forum_post , auth_view , auth_post , auth_topic , auth_annonce, auth_modo )
VALUES ( 1, 'Les News', 'Les news du site sont ici', 50, 0, 0, 0, 1, 2, 2, 3, 4 )
|
Maintenant que les champs sont remplis, le plus dur est fait ; ensuite, il n'y a plus qu'à mettre des conditions un peu partout pour vérifier les droits.
Une fonction ?
Quand j'ai dit mettre des conditions un peu partout, ça a du évidemment alerter votre logique de codeur php

. En effet, on va pouvoir simplifier tout ça avec une fonction, celle-ci prend un paramètre : le niveau nécessaire que doit avoir un membre. Puis elle nous dira si l'utilisateur peut continuer.
Code : PHP | <?php
function verif_auth($auth_necessaire)
{
$level=(isset($_SESSION['level']))?$_SESSION['level']:1;
return ($auth_necessaire <= intval($level));
}
?>
|
Pour l'utilisation, c'est super simple puisqu'il suffit de faire ceci :
Code : PHP | <?php
if(verif_auth(INSCRIT))
{
//Afficher le forum
}
else
{
//Laisser tomber :p
}
?>
|
Pensez bien à l'inclure sur toutes vos pages ! Le mieux est d'utiliser la page functions.php pour cela.
Page d'index
Pour la page d'index, on pourrait utiliser la fonction, néanmoins ce n'est qu'une sécurité superflue puisque la requête va déjà chercher les forums qui satisfont les autorisations d'accès. Pour l'exemple on va quand même regarder ce que ça donne.
Si vous vous souvenez bien, il y a une grosse requête qui est suivie par ceci :
Page : index.php
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | <?php
//Début de la boucle
while($data=$query->fetch())
{
//On affiche chaque catégorie
if( $categorie != $data['cat_id'] )
{
//Si c'est une nouvelle catégorie on l'affiche
$categorie = $data['cat_id'];
?>
<tr>
<th></th>
<th class="titre"><strong><?php echo $data['cat_nom']; ?>
</strong></th>
<th class="nombremessages"><strong>Sujets</strong></th>
<th class="nombresujets"><strong>Messages</strong></th>
<th class="derniermessage"><strong>Dernier message</strong></th>
</tr>
<?php
}
|
Et juste après, un
echo s'occupe d'afficher le contenu de chaque catégorie, c'est-à-dire chaque forum. C'est ici qu'on va agir

!
Ajoutez simplement après :
Code : PHP | <?php
if (verif_auth($data['auth_view']))
{
//Affichage des forums
?>
|
Vous comprenez à présent pourquoi la requête du début de page allait chercher le champ
auth_view ; par ailleurs, vous voyez que la fonction est vraiment simple à utiliser. On fait un
if, on affiche les forums, puis on ferme le
if. Ainsi, les forums qui apparaissent sont ceux que le membre a le droit de voir ; dans l'exemple du forum de news, tout le monde verra le forum.
Ensuite, on affiche les forums, puis on termine ici :
Code : PHP | <?php
else
{
echo'<td class="nombremessages">Pas de message</td></tr>';
}
} //Fin de la vérification d'autorisation
?>
|
A présent, le forum ne s'affiche plus si vous n'êtes pas autorisés à le voir ; en revanche, il est toujours possible de le modifier en se rendant directement sur la page
voirforum.php. On va voir comment arranger ça.
Attention à ne pas inverser le signe > en < : ça peut paraître idiot de dire ça, mais c'est une erreur fréquente, surtout lorsqu'on va un peu vite. Donc, si vous avez un résultat inattendu, il est probable que ça vienne d'ici.
Page voirforum
Maintenant que le forum s'affiche seulement pour les personnes autorisées, on va pouvoir passer à la page
voirforum.php, rien de bien compliqué sur cette page puisqu'il s'agit simplement de vérifier que le visiteur ne s'est pas introduit ici en modifiant l'url. Ensuite, on va regarder si celui-ci a le droit de poster un nouveau topic. Si c'est le cas, on affiche le bouton-lien qui permet de se rendre à la page poster.php.
Pour commencer, rendez-vous en haut de la page
voirforum.php, à l'endroit où vous voyez une requête dans ce style :
Page : voirforum.php
Code : PHP | <?php
//A partir d'ici, on va compter le nombre de messages
//pour n'afficher que les 25 premiers
$query=$db->prepare('SELECT forum_name, forum_topic, auth_view, auth_topic FROM forum_forum WHERE forum_id = :forum');
$query->bindValue(':forum',$forum,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
?>
|
Juste en dessous, nous allons utiliser la fonction pour vérifier les droits du membres : s'il y a un problème on utilise la fonction
erreur avant d'afficher quoi que ce soit. A vous d'aller faire les bonnes modifications dans la page constants.php, je vais pas tout faire non plus (nan mais !

)
Code : PHP | <?php
if (!verif_auth($data['auth_view']))
{
erreur(ERR_AUTH_VIEW);
}
?>
|
A présent, voyons le deuxième aspect qui est celui du bouton "nouveau topic". Recherchez un peu plus bas l'endroit où vous avez placé l'image :
Code : PHP | <?php
//Et le bouton pour poster
echo'<a href="./poster.php?action=nouveautopic&f='.$forum.'">
<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic" /></a>';
?>
|
Il faut cette fois vérifier l'autorisation en rapport avec le droit de créer un nouveau sujet, c'est donc le champ
auth_topic qui va être utilisé :
Code : PHP | <?php
if (verif_auth($data['auth_topic']))
{
//Et le bouton pour poster
echo'<a href="./poster.php?action=nouveautopic&f='.$forum.'">
<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic"></a>';
}
?>
|
L'idéal serait de placer une image alternative avec un
else pour que le membre ne soit pas complètement perdu en ne voyant plus son image

. Ou bien vous pouvez afficher un petit texte, pour lui expliquer qu'il n'a pas les droits.
Pour reprendre l'exemple du forum de news, un visiteur non connecté ou un simple membre ne pourrait pas voir ce bouton.
Vous voyez qu'en fait si on utilise la fonction, il ne s'agit que de légères modifications à faire ici et là ; cependant il ne faut pas non plus en oublier, sinon il suffira de connaître un peu le nom des pages pour pouvoir aller où l'on veut.
Page voirtopic.php
Dans la page
voirtopic.php, il faut vérifier encore une fois une série d'autorisations.
Tout d'abord, s'assurer que le membre a bien l'autorisation de voir le forum auquel appartient le sujet en question.
Puis, s'assurer qu'il a le droit de poster un nouveau topic (auquel cas on affiche l'image en question).
Et enfin s'assurer qu'il a le droit de poster une réponse.
Heureusement pour nous, le terrain est déjà préparé puisque vous devriez avoir une requête qui s'approche de ça :
Page : voirtopic.php
Code : PHP | <?php
$query=$db->prepare('SELECT topic_titre, topic_post, forum_topic.forum_id, topic_last_post,
forum_name, auth_view, auth_topic, auth_post
FROM forum_topic
LEFT JOIN forum_forum ON forum_topic.forum_id = forum_forum.forum_id
WHERE topic_id = :topic');
$query->bindValue(':topic',$topic,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
?>
|
Une fois encore, on ajoute sans plus attendre la première vérification :
Code : PHP | <?php
if (!verif_auth($data['auth_view']))
{
erreur(ERR_AUTH_VIEW);
}
?>
|
Enfin, on se dirige vers les boutons 'poster' et 'répondre', qu'on entoure des conditions suivantes :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | <?php
if (verif_auth($data['auth_post']))
{
//On affiche l'image répondre
echo'<a href="./poster.php?action=repondre&t='.$topic.'">
<img src="./images/repondre.gif" alt="Répondre" title="Répondre à ce topic"></a>';
}
if (verif_auth($data['auth_topic']))
{
//On affiche l'image nouveau topic
echo'<a href="./poster.php?action=nouveautopic&f='.$data['forum_id'].'">
<img src="./images/nouveau.gif" alt="Nouveau topic"
title="Poster un nouveau topic"></a>';
}
?>
|
Ce n'est pas plus compliqué que ça

. D'ailleurs on touche à la fin, il ne nous reste plus qu'à modifier une page.
Page poster.php
Comme ce qu'on fait depuis tout à l'heure est assez répétitif, et surtout assez facile, je vais vous laisser vous occuper seuls de cette page, parce qu'il est important que vous ayez compris le fonctionnement de ce système afin de pouvoir le personnaliser au maximum.
Voilà ce qu'il faut vérifier :
- déjà, que le visiteur a le droit d'être sur le forum (auth_view)
- ensuite, qu'il a le droit de poster un nouveau sujet (pour cela, il faut travailler à l'intérieur du switch après le case"nouveautopic":)
- enfin, de la même façon qu'il peut répondre (case"repondre":)
Encore une fois, tout est déjà mis en place grâce à une requête, celle-ci diffère selon qu'on se trouve dans le cas d'un nouveau topic ou d'une réponse.
Pensez à placer les vérifications avant d'afficher le contenu de la page : si elle n'est pas remplie, faîtes un simple
erreur, puis passez à la suite.
Pour ce qui est de la page postok.php, on ne peut logiquement pas s'y rendre en postant quelque chose, dans la mesure où l'accès à la page poster.php est bloqué si on n'a pas les droits. Toutefois, ça ne coûte rien de le faire quand même : faites donc exactement les mêmes modifications là-bas.
Nous avons maintenant terminé ce système d'autorisations ; dans tous les forums, vous pouvez régler différents niveaux d'accès. Libre à vous de faire une partie réservée aux modérateurs ou aux administrateurs.