• Aucun résultat trouvé

On passe au php

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

$query->CloseCursor();

On est arrivés en bas de notre page : voyons plus en détail ce code. La requête que l'on fait est très voisine de celle que l'on a utilisée pour lister les annonces, sauf qu'on limite le nombre de retours à un certain nombre. Ensuite, on remplit le nouveau tableau, et comme on liste d'abord les annonces, elles resteront toujours en haut ! Pour sélectionner les topics "normaux", il faut prendre ceux qui ne sont pas des annonces ; le signe <> signifie "différent de".

On termine

Elle est pas belle, la vie ? Vous avez maintenant une page qui liste les topics de chaque forum. Enfin je dis avez... il reste encore à terminer en fermant les balises.

Code : PHP

?>

</div>

</body></html>

Et voilà.

Voir un topic

La page voirtopic.php se construit comme le script de news présenté dans le TP. A savoir qu'on va afficher chaque message du plus ancien au plus récent, la seule différence, c'est qu'à la gauche de ces messages, on montrera l'avatar du membre qui a posté.

Le css

Tout ceci nécessite un petit tour par notre fichier CSS. Voici comment j'ai fait, libre à vous de modifier chaque ligne pour les adapter à votre design.

Code : CSS

.vt_auteur {width:20%;

background-color : rgb(244,238,250);

}.vt_mess {

width:75%;

background-color : rgb(244,238,250);

}

On va donc faire un tableau à deux colonnes, la première affichera les infos sur le membre qui a posté (son avatar, son nom, etc.), et la seconde son message .

On passe au php

Comme pour la page voirforum.php, on doit d'abord compter le nombre de messages pour compter le nombre de pages nécessaires, afin d'en afficher que 15 par page.

Page : voirtopic.php

Code : PHP

<?php

session_start();

$titre="Voir un sujet";

include("includes/identifiants.php");

include("includes/debut.php");

include("includes/menu.php");

include("includes/bbcode.php"); //On verra plus tard ce qu'est ce fichier

//On récupère la valeur de t

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

//A partir d'ici, on va compter le nombre de messages pour n'afficher que les 15 premiers

$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();

$forum=$data['forum_id'];

$totalDesMessages = $data['topic_post'] + 1;

$nombreDeMessagesParPage = 15;

$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);

?>

Vous remarquez que le code est exactement pareil, sauf qu'on récupère t la place de f. Par ailleurs, puisqu'il nous faut aussi des infos sur le forum auquel appartient le sujet, il faut faire une jointure.

Et si j'ai envie d'afficher 10 messages ? Je dois changer le script ?

En fait, le script qu'on est en train de réaliser est temporaire ; dans la seconde partie de ce tuto consacrée à la partie administration, on aura à le modifier légèrement. Ainsi, vous pourrez changer le nombre de messages par page facilement.

Maintenant qu'on a le haut de notre page, on va afficher le titre et l'éternel fil d'Ariane.

Code : PHP

<?php

echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> -->

<a href="./voirforum.php?

f='.$forum.'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>

--> <a href="./voirtopic.php?

t='.$topic.'">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a>';

echo '<h1>'.stripslashes(htmlspecialchars($data['topic_titre'])).'</h1><br /><br />';

?>

Enfin, on compte le nombre de pages, et on commence notre boucle pour afficher tous les messages. Vous allez voir que

finalement ce script est l'un des plus simples.

Code : PHP

<?php

//Nombre de pages

$page = (isset($_GET['page']))?intval($_GET['page']):1;

//On affiche les pages 1-2-3 etc...

echo '<p>Page : ';

for ($i = 1 ; $i <= $nombreDePages ; $i++)

{ if ($i == $page) //On affiche pas la page actuelle en lien {

echo $i;

} else {

echo '<a href="voirtopic.php?t='.$topic.'&page='.$i.'">

' . $i . '</a> ';

}

}echo'</p>';

$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

//On affiche l'image répondre

echo'<a href="./poster.php?action=repondre&amp;t='.$topic.'">

<img src="./images/repondre.gif" alt="Répondre" title="Répondre à ce topic" /></a>';

//On affiche l'image nouveau topic echo'<a href="./poster.php?

action=nouveautopic&amp;f='.$data['forum_id'].'">

<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic" /></a>';

$query->CloseCursor();

//Enfin on commence la boucle !

?>

Je m'arrête une minute avant d'afficher la requête (je vous rassure, elle n'est pas trop longue ). En fait, vous devriez être capables de la faire tout seuls comme des grands pendant que je pars siroter un café si vous avez bien compris les jointures. On doit prendre, à partir de l'id du créateur de chaque post, toutes les infos possibles sur ce membre.

Voilà comment faire : Code : PHP

<?php

$query=$db->prepare('SELECT post_id , post_createur , post_texte , post_time ,

membre_id, membre_pseudo, membre_inscrit, membre_avatar, membre_localisation, membre_post, membre_signature

FROM forum_post

LEFT JOIN forum_membres ON forum_membres.membre_id = forum_post.post_createur

WHERE topic_id =:topic ORDER BY post_id

LIMIT :premier, :nombre');

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

$query->bindValue(':premier',(int)

$premierMessageAafficher,PDO::PARAM_INT);

$query->bindValue(':nombre',(int)

$nombreDeMessagesParPage,PDO::PARAM_INT);

$query->execute();

//On vérifie que la requête a bien retourné des messages if ($query->rowCount()<1)

<th class="vt_mess"><strong>Messages</strong></th>

</tr>

<?php

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

Vous avez vu qu'une fois encore je vérifie si la requête retourne au moins un message. En général, ça sera le cas puisque lors de la création d'un topic, on y adjoint un premier post. Mais comment on ne sait jamais, il vaut mieux vérifier .

Sinon, on lance notre beau tableau, et on va voir de suite quoi mettre dedans.

Code : PHP

<?php

//On commence à afficher le pseudo du créateur du message : //On vérifie les droits du membre

Les modérateurs pourront aussi le faire, il faudra donc revenir sur ce code un peu plus tard ! */

title="Supprimer ce message" /></a>

<a href="./poster.php?p='.$data['post_id'].'&amp;action=edit">

Posté à '.date('H\hi \l\e d M y',$data['post_time']).'

</td></tr>';

<br />Membre inscrit le '.date('d/m/Y',$data['membre_inscrit']).'

<br />Messages : '.$data['membre_post'].'<br />

Localisation : '.stripslashes(htmlspecialchars($data['membre_localisation'])).'</td>'

//Message

echo'<td>'.code(nl2br(stripslashes(htmlspecialchars($data['post_texte']))))

<br /><hr

/>'.code(nl2br(stripslashes(htmlspecialchars($data['membre_signature'])))).'</td></tr>' } //Fin de la boucle ! \o/

$query->CloseCursor();

?>

</table>

C'est quoi, la fonction code ?

C'est une fonction que l'on va se dépêcher de créer dans le prochain chapitre du cours. Dans un forum, on donne la possibilité de mettre en forme son texte (gras, italique, souligné...). Mais on ne peut pas laisser le membre utiliser les balises html, car ça serait trop dangereux ; c'est pourquoi on utilise des balises qu'on convertit ensuite en html grâce à la fonction code. Pensez par exemple au Zcode .

Bon, bah on a terminé notre boucle, on a fermé notre tableau, il reste à terminer la page : Code : PHP

<?php

echo '<p>Page : ';

for ($i = 1 ; $i <= $nombreDePages ; $i++) {

if ($i == $page) //On affiche pas la page actuelle en lien

{

echo $i;

} else {

echo '<a href="voirtopic.php?

t='.$topic.'&amp;page='.$i.'">

' . $i . '</a> ';

} }

echo'</p>';

//On ajoute 1 au nombre de visites de ce topic $query=$db->prepare('UPDATE forum_topic

SET topic_vu = topic_vu + 1 WHERE topic_id = :topic');

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

$query->execute();

$query->CloseCursor();

} //Fin du if qui vérifiait si le topic contenait au moins un message

?>

</div>

</body>

</html>

Héhé... on a terminé . C'était peut-être un peu long, mais à présent, les posts sont listés, tout comme les topics ! C'est maintenant à vous de voir comment vous voulez organiser votre page : dans l'exemple, j'ai fait apparaitre pour chaque message le pseudo du membre, son avatar, le nombre de messages qu'il a postés et sa localisation. Mais personne ne vous interdit de mettre autre chose .

Voilà : on est arrivés au bout. Ces deux scripts sont assez longs, et j'avoue que j'ai pas mal hésité à les placer dans le même chapitre. Mais si vous lisez ces lignes, c'est que vous y êtes arrivés .

Prochain chapitre : comment poster un message. Allez, on y va.

Poster

Si vous avez suivi tous les chapitres jusqu'ici, vous avez dû vous rendre compte que, pour l'instant, le forum n'est qu'une coquille vide, dans la mesure où on ne peut pas poster de message. Après la lecture de cette page, ça va être chose faite. On va en effet s'occuper de la page poster.php, qui constitue par ailleurs la dernière de cette partie.

Le script de cette page ne sera pas final. On va en fait simplement voir ici comment poster un message. Plus tard, on s'occupera de savoir comment les modérateurs pourront supprimer ou éditer des messages.

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