• Aucun résultat trouvé

Une dernière chose importante !

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

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 !

Correction

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 !

Dans les codes qui suivent, je n'ai pas systématiquement déclaré mes constantes, en particulier en lien avec la fonction erreur. Vous êtes grands et vous pouvez le faire seuls !

É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

<?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

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

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

$query->execute();

$data=$query->fetch();

$text_edit = $data['post_texte']; //On récupère le message //Ensuite on vérifie que le membre a le droit d'être ici (soit le créateur soit un modo/admin)

if (!verif_auth($data['auth_modo']) && $data['post_createur'] !=

$id) {

<form method="post" action="postok.php?action=edit&amp;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

<?php

case "edit": //Si on veut éditer le post //On récupère la valeur de p

$post = (int) $_GET['p'];

//On récupère le message $message = $_POST['message'];

//Ensuite on vérifie que le membre a le droit d'être ici (soit le créateur soit un modo/admin)

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

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

$query->execute();

$data1 = $query->fetch();

$topic = $data1['topic_id'];

//On récupère la place du message dans le topic (pour le lien) $query = $db->prepare('SELECT COUNT(*) AS nbr FROM forum_post WHERE topic_id = :topic AND post_time < '.$data1['post_time']);

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

$query->execute();

$data2=$query->fetch();

if (!verif_auth($data1['auth_modo'])&& $data1['post_createur']

!= $id) {

// Si cette condition n'est pas remplie ça va barder :o erreur(ERR_AUTH_EDIT);

}

else //Sinon ça roule et on continue {

$query=$db->prepare('UPDATE forum_post SET post_texte = :message WHERE post_id = :post');

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

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

$query->execute();

$nombreDeMessagesParPage = 15;

$nbr_post = $data2['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.'&amp;page='.$page.'#p_'.$post.'">ici</a> pour le

voir</p>';

$query->CloseCursor();

} 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

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

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

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

$query->execute();

$data = $query->fetch();

if (!verif_auth($data['auth_modo']) && $data['post_createur'] !=

$id) {

// Si cette condition n'est pas remplie ça va barder :o erreur(ERR_AUTH_DELETE);

}

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&amp;p='.$post.'">Oui</a> ou <a href="./index.php">Non</a></p>';

}

$query->CloseCursor();

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

<?php

case "delete": //Si on veut supprimer le post //On récupère la valeur de p

$post = (int) $_GET['p'];

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

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

$query->execute();

if (!verif_auth($data['auth_modo']) && $poster != $id) { $query = $db->prepare('SELECT topic_first_post,

topic_last_post FROM forum_topic WHERE topic_id = :topic');

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

$query->execute();

if ($data_post['topic_first_post']==$post) //Si le message est le premier

//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 /> WHERE topic_id = :topic

ORDER BY post_id DESC LIMIT 0,1');

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

ORDER BY post_id DESC LIMIT 0,1');

$query->bindValue(':forum',$forum,PDO::PARAM_INT); forum_post - 1, forum_last_post_id = :last

WHERE forum_id = :forum');

$query->execute();

$query->CloseCursor();

//On enlève 1 au nombre de messages du membre $query=$db->prepare('UPDATE forum_membres SET membre_post = membre_post - 1

WHERE membre_id = :id');

Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum</p>'; forum_post - 1 WHERE forum_id = :forum');

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

WHERE membre_id = :id');

Cliquez <a href="./index.php">ici</a> pour revenir à l index du forum</p>';

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 .

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