• Aucun résultat trouvé

Retour sur la modification du nombre de post

Dans le document Créer son forum de toutes pièces (Page 102-106)

$query->CloseCursor();

//Et on supprime les posts !

$query=$db->prepare('DELETE FROM forum_post WHERE topic_id = :topic');

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$query->CloseCursor();

//Dernière chose, on récupère le dernier post du forum $query=$db->prepare('SELECT post_id FROM forum_post WHERE post_forum_id = :forum ORDER BY post_id DESC LIMIT 0,1');

$query->bindValue(':forum',$forum,PDO::PARAM_INT);

$query->execute();

$data = $query->fetch();

//Ensuite on modifie certaines valeurs : $query=$db->prepare('UPDATE forum_forum

SET forum_topic = forum_topic - 1, forum_post = forum_post - :nbr, forum_last_post_id = :id

WHERE forum_id = :forum');

$query->bindValue(':nbr',$nombrepost,PDO::PARAM_INT);

$query->bindValue(':id',$data['post_id'],PDO::PARAM_INT);

$query->bindValue(':forum',$forum,PDO::PARAM_INT);

$query->execute();

$query->CloseCursor();

//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>';

} //Fin du else 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

<?php

//On enlève le nombre de post posté par chaque membre dans le topic

$query=$db->prepare('SELECT post_createur, COUNT(*) AS nombre_mess FROM forum_post

WHERE topic_id = :topic GROUP BY post_createur');

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

while($data = $query->fetch()) {

$query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post - :mess

WHERE membre_id = :id');

$query->bindValue(':mess',$data['nombre_mess'],PDO::PARAM_INT);

$query->bindValue(':id',$data['post_createur'],PDO::PARAM_INT);

$query->execute();

}

?>

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

<?php

$query = $db->prepare('SELECT topic_locked FROM forum_topic WHERE topic_id = :topic');

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$data=$query->fetch();

if ($data['topic_locked'] == 1) // Topic verrouillé !

{ echo'<a href="./postok.php?action=unlock&t='.$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&amp;t='.$topic.'">

<img src="./images/lock.gif" alt="verrouiller" title="Verrouiller ce sujet" /></a>';

}$query->CloseCursor();

?>

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

<?php

case "lock": //Si on veut verrouiller le topic //On récupère la valeur de t

$topic = (int) $_GET['t'];

$query = $db->prepare('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');

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$data = $query->fetch();

//Ensuite on vérifie que le membre a le droit d'être ici if (!verif_auth($data['auth_modo']))

{

$query=$db->prepare('UPDATE forum_topic SET topic_locked = :lock WHERE topic_id = :topic');

$query->bindValue(':lock',1,PDO::PARAM_STR);

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$query->CloseCursor();

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'];

$query = $db->prepare('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');

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$data = $query->fetch();

//Ensuite on vérifie que le membre a le droit d'être ici if (!verif_auth($data['auth_modo']))

{

$query=$db->prepare('UPDATE forum_topic SET topic_locked = :lock WHERE topic_id = :topic');

$query->bindValue(':lock',0,PDO::PARAM_STR);

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$query->CloseCursor();

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 : PHP

<?php

case "repondre":

//On passe le message dans une série de fonction $message = $_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

<?php

$query=$db->prepare('SELECT topic_locked FROM forum_topic WHERE topic_id = :topic');

$query->bindValue(':topic',$topic,PDO::PARAM_INT);

$query->execute();

$data=$query->fetch();

if ($data['topic_locked'] != 0) {

erreur(ERR_TOPIC_VERR); //A vous d'afficher un message du genre : le topic est verrouillé qu'est ce que tu fous là !?

}

$query->CloseCursor();

?>

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 .

Dans le document Créer son forum de toutes pièces (Page 102-106)