Welcome, you're not connected. ( Log in - Register )

Les commandes sont pour le moment fermées jusqu'à nouvel ordre, mais je peux assurer le support.

Merci de votre compréhension.


Requests are currently closed, but I can do some support.

Thanks for your understanding.




Important links - Liens importants

Règles - Rules | Présentez-vous - Introduce yourself | Problème d'inscription ? - Registration problem ?

Ishimaru-Design > Tutoriaux, ressources et support (fr) > FluxBB 1.4 > Tutoriels > [fluxbb] Derniers sujets sur son site

RSS >  [fluxbb] Derniers sujets sur son site
Ishimaru Chiaki #1 10/08/2011 - 18h35

Class : ID Admin
Posts : 1432
Registered on : 12/11/2007
Age : 28
Sex : Female

Offline Mail Www

Vous êtes en train de faire un site utilisant les sessions de votre forum FluxBB, et vous aimeriez bien afficher les 10 dernères réponses dans le menu latéral du site ?

Ce tutoriel va vous montrer à insérer ce module sur votre site.

Prérequis

Tout d'abord, vous devez absolument avoir inclus le fichier common.php du forum avant l'entête de votre site.  Pour cela, suivez cette page de documentatiion de FluxBB.fr.

Création du fichier

Commencez d'abord par créer le nouveau fichier qui contiendra le code (lastposts.php), puis incluez-la où vous le voulez (menu latéral, accueil, etc.)

<?php include('include/lastposts.php'); ?>

(faites de préférence un dossier spécifique pour les différents fichiers inclus de votre site, ça fait plus rangé)

Pour la suite, je donnerai les codes en fonction d'un affichage dans un menu latéral.  Vous n'avez qu'à adapter le code HTML pour vos besoins.
Aussi, même si j'utilise un système de clés de langue sur mon site, je donnerai les codes avec les textes en dur.  Libre à vous de les rendre localisables comme je le fais.

Code de base

On commence avec le code de base, à mettre dans votre fichier :
<div class="submenu">
<h2>Dernières réponses</h2>
<ul class="lasttopics">
<?php

    //Contenu du module

?>
</ul>
</div>


On a donc notre bloc, avec le titre et la liste à puces... qui n'a pas de puces pour le moment, mais ça va venir.

La constante

Afin de pouvoir changer plus facilement le nombre de réponses, par exemple pour en avoir 5 au lieu de 10, on va définir une constante, de cette façon :
define('PUN_REPLIES',10);


Il ne restera qu'à insérer cette constante dans les requêtes qui viendront par la suite.  Vous n'avez qu'à changer le nombre si vous voulez un nombre différent de 10 (ex: 5 ou 20)

la condition

Maintenant, puisque vous avez sûrement des sujets qui ne sont pas visibles aux invités, voire à certains groupes, il vous faudra vérifier le statut de l'utilisateur.
Puisque l'administrateur a accès à tous les sujets, on va donc vérifier si l'utilisateur est administrateur du forum, en utilisant la variable utilisateur $pun_user['g_id'] avec la constante PUN_ADMIN, dans une condition if...else :
if($pun_user['g_id'] != PUN_ADMIN) {
   //Requêtes en fonction d'un utilisateur qui n'est pas admin
}
else {
   //Requête en fonction d'un utilisateur qui est admin
}


Vous le placez après la ligne de la constante.
Cela vous donnera ceci, jusqu'ici :
<div class="submenu">
<h2>Dernières réponses</h2>
<ul class="lasttopics">
<?php
//On définit la constante pour le nombre de réponses
define('PUN_REPLIES',10);

if($pun_user['g_id'] != PUN_ADMIN) {
   //Requêtes en fonction d'un utilisateur qui n'est pas admin
}
else {
   //Requête en fonction d'un utilisateur qui est admin
}

?>
</ul>
</div>


On est prêt à mettre du gras dans nos conditions !

Les requêtes

Note : Puisque la requête finale va varier selon plusieurs paramètres, je vais utiliser une variable pour stocker la requête, afin de ne la lancer véritablement qu'une fois les vérifications terminées.

Puisqu'un utilisateur qui n'est pas admin peut ne pas avoir accès aux sujets de certains forums, on doit d'abord connaître les forums à exclure, ce qui fait que dans la première partie de notre condition, on va d'abord faire une première requête pour récupérer les forums ayant la permission de lecture à 0 pour son groupe.  Une boucle permet ensuite de récupérer le tout sous forme d'un tableau.
   $req = $db->query('SELECT id
                   FROM '.$db->prefix.'forums
                   JOIN '.$db->prefix.'forum_perms ON forum_id=id
                   WHERE group_id='.$pun_user['g_id'].' AND read_forum=0');
   $ids = array();
   while($auth = $db->fetch_assoc($req))
   {
       $ids[] = $auth['id'];
   }


Mais puisqu'il se peut qu'il n'y ait pas de forum à exclure, on doit vérifier le nombre de clés dans le tableau résultant.  Pour cela, on va utiliser la fonction count() dans une condition :
  if(count($ids) > 0) {
       //Il y a des forums à exclure
   }
   else {
       //Il n'y a pas de forum à exclure
   }


Dans le cas où l'on doit exclure des forums, on doit ajuster la requête pour exclure les sujets se trouvant dans lesdits forums.
       $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           WHERE forum_id NOT IN ('.implode(',',$ids).')
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;


Vous vous rappelez de la constante PUN_REPLIES au début ?  Cela vous évite d'avoir à fouiller au coeur des requêtes juste pour changer le nombre de réponses à afficher.
Ensuite, vous remarquerez le NOT IN ('implode(',',$ids.') dans la troisième ligne.  C'est là que s'effectue le tri pour exclure les sujets inaccessibles à l'utilisateur.  Et puisque NOT IN doit travailler avec une chaîne de caractères en utilisant la virgule comme séparateur, il suffit d'utiliser la fonction implode() pour "aplatir" notre tableau !

Maintenant, s'il n'y a rien à exclure, on n'a qu'à refaire la requête, sans la troisième ligne.  Cette requête est la même quand la première requête ne retourne aucun forum à exclure et quand l'utilisateur est admin.
      $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;


Voici ce que ça donne jusqu'ici :
<div class="submenu">
<h2>Dernières réponses</h2>
<ul class="lasttopics">
<?php
//On définit la constante pour le lien relatif vers le profil
define('PUN_REPLIES',10);

//C'est pas mal plus simple d'aller chercher les forums inaccessibles à l'utilisateur avant de faire le reste
if($pun_user['g_id'] != PUN_ADMIN) {
   $req = $db->query('SELECT id
                   FROM '.$db->prefix.'forums
                   JOIN '.$db->prefix.'forum_perms ON forum_id=id
                   WHERE group_id='.$pun_user['g_id'].' AND read_forum=0');
   $ids = array();
   while($auth = $db->fetch_assoc($req))
   {
       $ids[] = $auth['id'];
   }
   if(count($ids) > 0) {
       $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           WHERE forum_id NOT IN ('.implode(',',$ids).')
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;
   }
   else {
       $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;
   }
}
else {
   $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;
}

?>
</ul>
</div>


Maintenant, il ne nous reste plus qu'à s'occuper de l'affichage.

Affichage des réponses

On est maintenant rendu au meilleur, soit l'affichage des réponses en tant que tel !

Puisqu'on n'a fait que préparer la requête, on va maintenant la lancer, et faire notre boucle pour récupérer tout ça :
$result = $db->query($sql) or error('Unable to fetch replies list', __FILE__, __LINE__, $db->error());
while ($val = $db->fetch_assoc($result))
{
   //Affichage des données
}


Mais avant de tout afficher, je vous rappelle que si un sujet contient beaucoup de messages, il fera plusieurs pages.  Or, le nombre de messages par page peut varier selon les préférences de l'utilisateur (si l'utilisateur est enregistré) et selon la valeur par défaut définie dans le panneau d'administration, pour les invités.
Pour cela, on va vérifier si le variable utilisateur $pun_user['disp_posts'] est vide ou non, en utilisant une condition.
   //On vérifie si la valeur de notre variable de préférence existe
   if (!empty($pun_user['disp_posts']))
   {
       //dans ce cas, on simplifie nos variables pour la suite
       $disp_posts = $pun_user['disp_posts'];
       $num_replies = $val['num_replies'];
   }
   else //la valeur est vide, donc on prend la valeur par défaut
   {
       $num_replies = $pun_config['o_disp_posts_default'];
       $num_replies = $val['num_replies'];
   }

J'ai simplifié les variables pour ne pas avoir des variables à rallonge au moment de l'affichage.

On termine finalement avec l'affichage final, où l'on calcule la page de la réponse en même temps !
  //On affiche tout !
   echo '<li><a href="'.PUN_ROOT.'viewtopic.php?id'.$val['id'].'&amp;p='.ceil(($num_replies+1)/$disp_posts).'&amp;pid='.$val['last_post_id'].'#'.$val['last_post_id'].'" rel="nofollow">'. $val['subject'].'</a> &raquo; ' .date('d/m/Y - H\:i',$val['last_post']) . $lang['lastposts_by'] .' '.$val['last_poster'].'</li>';

Le rel="nofollow" sert à indiquer aux moteurs de recherche de ne pas indexer ces liens, afin de prévenir les duplications de contenu.

Résultat final

Voici ce que ça donne au final :
<div class="submenu">
<h2>Dernières réponses</h2>
<ul class="lasttopics">
<?php
//On définit la constante pour le lien relatif vers le profil
define('PUN_REPLIES',10);

//C'est pas mal plus simple d'aller chercher les forums inaccessibles à l'utilisateur avant de faire le reste
if($pun_user['g_id'] != PUN_ADMIN) {
   $req = $db->query('SELECT id
                   FROM '.$db->prefix.'forums
                   JOIN '.$db->prefix.'forum_perms ON forum_id=id
                   WHERE group_id='.$pun_user['g_id'].' AND read_forum=0');
   $ids = array();
   while($auth = $db->fetch_assoc($req))
   {
       $ids[] = $auth['id'];
   }
   if(count($ids) > 0) {
       $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           WHERE forum_id NOT IN ('.implode(',',$ids).')
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;
   }
   else {
       $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;
   }
}
else {
   $sql = 'SELECT id,subject,num_replies,last_post,last_post_id,last_poster,forum_id
           FROM '.$db->prefix.'topics
           ORDER BY last_post_id DESC LIMIT 0,'.PUN_REPLIES;
}
// Récupération des sonnées des derniers sujets
$result = $db->query($sql) or error('Unable to fetch replies list', __FILE__, __LINE__, $db->error());
while ($val = $db->fetch_assoc($result))
{
   //On vérifie si la valeur de notre variable de préférence existe
   if (!empty($pun_user['disp_posts']))
   {
       //dans ce cas, on simplifie nos variables pour la suite
       $disp_posts = $pun_user['disp_posts'];
       $num_replies = $val['num_replies'];
   }
   else //la valeur est vide, donc ce sera la valeur par défaut
   {
       $num_replies = $pun_config['o_disp_posts_default'];
       $num_replies = $val['num_replies'];
   }
   //On affiche tout !
   echo '<li><a href="'.PUN_ROOT.'viewtopic.php?id'.$val['id'].'&amp;p='.ceil(($num_replies+1)/$disp_posts).'&amp;pid='.$val['last_post_id'].'#'.$val['last_post_id'].'" rel="nofollow">'. $val['subject'].'</a> &raquo; ' .date('d/m/Y - H\:i',$val['last_post']) . $lang['lastposts_by'] .' '.$val['last_poster'].'</li>';
}

?>
</ul>
</div>


Il ne vous reste plus qu'à styler le tout avec du CSS !

 >  Fast reply

Message

Ishimaru-Design > Tutoriaux, ressources et support (fr) > FluxBB 1.4 > Tutoriels > [fluxbb] Derniers sujets sur son site

 >  Stats

1 user(s) connected during the last 10 minutes (0 member(s) and 1 guest(s)).