26
mai 06
Afficher les commentaires dans list.php
Par Guillaume BIZET | Lien permanent
Pour que cela soit plus sympa j'ai voulu afficher les commentaires à la suite des billets dans la page d'accueil.
Je me suis dit que cela ne devait pas être très compliqué vu que le module des commentaires était déjà codé dans le fichier post.php du thème.
Erreur. Enfin cela reste assez simple quand même.
Démonstration ...
Dotclear affiche la liste des billets grâce à une boucle qui va chercher dans la base SQL les n derniers billets[1] pour les afficher
La boucle du fichier list.php de base (thème par défaut) est le suivant :
<?php while ($news->fetch()) : ?> <div class="post"> <?php dcDayDate('<p class="day-date">%s</p>'); ?> <h2 id="p<?php dcPostID(); ?>"class="post-title"><a href="<?php dcPostURL(); ?>"><?php dcPostTitle(); ?></a></h2> <p class="post-info">Par <?php dcPostAuthor(); ?>, <?php dcPostDate(); ?> à <?php dcPostTime(); ?> <span>::</span> <a href="<?php dcPostCatURL(); ?>"><?php dcPostCatTitle(); ?></a> </p> <div class="post-content" <?php dcPostLang(); ?>> <?php dcPostAbstract('%s','<p><a href="%s" title="Lire %s">Lire la suite</a></p>'); ?> </div> <p class="post-info-co"><a href="<?php dcPostURL(); ?>#co"title="commentaires pour : <?php dcPostTitle(); ?>"><?php dcPostNbComments('aucun commentaire','un commentaire','%s commentaires');?></a> <span>::</span> <a href="<?php dcPostURL(); ?>#tb"title="trackbacks pour : <?php dcPostTitle(); ?>"><?php dcPostNbTrackbacks('aucun trackback','un trackback','%s trackbacks');?></a> </p> </div> <?php endwhile; ?>
Donc au début je me suis dit :
Je vais coller à la suite le module de commentaires de post.php en enlevant la partie pour poster un commentaire
ce qui donnait :
<?php while ($news->fetch()) : ?> <div class="post"> <?php dcDayDate('<p class="day-date">%s</p>'); ?> <h2 id="p<?php dcPostID(); ?>"class="post-title"><a href="<?php dcPostURL(); ?>"><?php dcPostTitle(); ?></a></h2> <p class="post-info">Par <?php dcPostAuthor(); ?>, <?php dcPostDate(); ?> à <?php dcPostTime(); ?> <span>::</span> <a href="<?php dcPostCatURL(); ?>"><?php dcPostCatTitle(); ?></a> </p> <div class="post-content" <?php dcPostLang(); ?>> <?php dcPostAbstract('%s','<p><a href="%s" title="Lire %s">Lire la suite</a></p>'); ?> </div> <p class="post-info-co"><a href="<?php dcPostURL(); ?>#co"title="commentaires pour : <?php dcPostTitle(); ?>"><?php dcPostNbComments('aucun commentaire','un commentaire','%s commentaires');?></a> <span>::</span> <a href="<?php dcPostURL(); ?>#tb"title="trackbacks pour : <?php dcPostTitle(); ?>"><?php dcPostNbTrackbacks('aucun trackback','un trackback','%s trackbacks');?></a> </p> </div> <div id="comments"> <h3 id="co">Commentaires</h3> <?php if ($comments->isEmpty()) : /* Message si aucune commentaire */ ?> <p>Aucun commentaire pour le moment.</p> <?php endif; ?> <?php while ($comments->fetch()) : /* Boucle de commentaires */ // On met le numéro du commentaire dans une variable $co_num = $comments->int_index+1;?> <p id="c<?php dcCommentID(); ?>" class="comment-info"> <span class="comment-number"><a href="#c<?php dcCommentID(); ?>"><?php echo $co_num; ?>.</a></span> Le <?php dcCommentDate(); ?> à <?php dcCommentTime(); ?>, par <strong><?php dcCommentAuthor(); ?></strong> </p> <?php /* on affiche le commentaire */ ?> <blockquote> <?php dcCommentContent(); ?> </blockquote> <?php endwhile; ?> </div> <?php endwhile; ?>
Mais après un test aucun commentaire n'apparaissait à la suite des billets concernés.
En fait c'est tout a fait normal puisque la variable globale $comments n'est pas initialisée en dehors du mode 'post' : merci Pep
La solution est d'ailleurs assez simple, il faut initialiser la variable $comments par ce code :
<?php $comments = $blog->getComments($news->f('post_id')); ?>
Que l'on place juste avant la boucle des commentaires.
Donc le fichier list.php final est donc le suivant :
<?php while ($news->fetch()) : ?> <div class="post"> <?php dcDayDate('<p class="day-date">%s</p>'); ?> <h2 id="p<?php dcPostID(); ?>"class="post-title"><a href="<?php dcPostURL(); ?>"><?php dcPostTitle(); ?></a></h2> <p class="post-info">Par <?php dcPostAuthor(); ?>, <?php dcPostDate(); ?> à <?php dcPostTime(); ?> <span>::</span> <a href="<?php dcPostCatURL(); ?>"><?php dcPostCatTitle(); ?></a> </p> <div class="post-content" <?php dcPostLang(); ?>> <?php dcPostAbstract('%s','<p><a href="%s" title="Lire %s">Lire la suite</a></p>'); ?> </div> <p class="post-info-co"><a href="<?php dcPostURL(); ?>#co"title="commentaires pour : <?php dcPostTitle(); ?>"><?php dcPostNbComments('aucun commentaire','un commentaire','%s commentaires');?></a> <span>::</span> <a href="<?php dcPostURL(); ?>#tb"title="trackbacks pour : <?php dcPostTitle(); ?>"><?php dcPostNbTrackbacks('aucun trackback','un trackback','%s trackbacks');?></a> </p> </div> <div id="comments"> <?php $comments = $blog->getComments($news->f('post_id')); ?> <h3 id="co">Commentaires</h3> <?php if ($comments->isEmpty()) : /* Message si aucune commentaire */ ?> <p>Aucun commentaire pour le moment.</p> <?php endif; ?> <?php while ($comments->fetch()) : /* Boucle de commentaires */ // On met le numéro du commentaire dans une variable $co_num = $comments->int_index+1;?> <p id="c<?php dcCommentID(); ?>" class="comment-info"> <span class="comment-number"><a href="#c<?php dcCommentID(); ?>"><?php echo $co_num; ?>.</a></span> Le <?php dcCommentDate(); ?> à <?php dcCommentTime(); ?>, par <strong><?php dcCommentAuthor(); ?></strong> </p> <?php /* on affiche le commentaire */ ?> <blockquote> <?php dcCommentContent(); ?> </blockquote> <?php endwhile; ?> </div> <?php endwhile; ?>
Et voilà tout fonctionne.
Ensuite à vous de modifier ou non les informations (dans la partie commentaires) que vous souhaitez afficher ou non à la suite des billets concernés.
Par exemple moi je n'ai pas voulu afficher de message si aucun commentaire n'était posté sur le billet donc j'ai enlevé cette portion de code :
<?php if ($comments->isEmpty()) : /* Message si aucune commentaire */ ?> <p>Aucun commentaire pour le moment.</p> <?php endif; ?>
Et j'ai rajouté un encart pour qu'en cliquant on passe en mode post et que l'on arrive directement sur le formulaire de post des commentaires grâce à ce code :
<p><strong>Ecrire un commentaire pour le billet :</strong><br /> <a href="<?php dcPostURL(); ?>#ajcomment" ><?php dcPostTitle(); ?></a></p>
A vous d'adapter le code selon vos besoins.
Notes
[1] Selon la configuration établie dans outils>Configuration de Dotclear

































Commentaires
compositeur
07/10/2007 - 09:47
je tenais à te fairr un petit mot pour te dire que ton blog esdt très sympathique
Mr.Bark
12/10/2007 - 15:16
je tenai à te dire que tu gagnerais à être reconnnu par tous
karpediem
06/06/2008 - 14:38
Bonjour,
Tout d'abord, bravo pour ton blog, j'y trouve toujours des astuces pertinentes, comme celle-ci d'ailleurs !
Je souhaiterai la modifier un tout petit peu...
En fait, je souhaiterai afficher les commentaire que pour 2 billets.
J'ai essayé d'insérer ce code pour tester la récupération de l'identifiant de mon billet, mais je dois avoir un pb avec la syntaxe car il m'affiche toujours "OK" :
<?php if ($post_id == '4') {echo "<br />OK"; }?>
Je l'ai placé juste avant :
<div id="comments">
Aurais-tu une idée de comment je pourrais faire ?
Merci
karpediem
07/06/2008 - 03:23
ça y est, j'ai rouvé, en m'inspirant de tes commentaires...
J'ai mis
<?php if ($news->f('post_id') == 4) : ?>
et c'est ok.
Merci pour l'ensemble de ton blog !
john doe
18/09/2008 - 11:55
bonjour, et merci pour le coup de main.
saurais -tu comment il est possible de n'afficher que les derniers commentaires (3 ou 4 par exemple?)
merci d'avance
mathieu
27/09/2008 - 11:39
Bonjour, chapeau pour ce kjoli design ! très agréable à regarder (& à lire)
bonne continiuation !