Le blog de Guillaume Bizet

Le blog de Guillaume BIZET : Blogging, iPhone, Webdesign, XHTML, CSS, Web2.0, Dotclear et Dotclear2, ...

Aller au contenu | Aller au menu | Aller à la recherche

Afficher les commentaires dans list.php

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(); ?> &agrave; <?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(); ?> &agrave; <?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(); ?> &agrave;
 				<?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(); ?> &agrave; <?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(); ?> &agrave;
 				<?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

Guillaume BIZET

Auteur: Guillaume BIZET

Restez au courant de l'actualité et abonnez-vous au Flux RSS du blog ou du Flux RSS de cette catégorie

compositeur compositeur ·  07 octobre 2007, 09:47

je tenais à te fairr un petit mot pour te dire que ton blog esdt très sympathique :-)

Mr.Bark Mr.Bark ·  12 octobre 2007, 15:16

je tenai à te dire que tu gagnerais à être reconnnu par tous :)

karpediem karpediem ·  06 juin 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 karpediem ·  07 juin 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 john doe ·  18 septembre 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 mathieu ·  27 septembre 2008, 11:39

Bonjour, chapeau pour ce kjoli design ! très agréable à regarder (& à lire) :) bonne continiuation !

Helen  -  Colon Cleanse Helen - Colon Cleanse ·  14 janvier 2009, 09:56

Bonjour! Votre blog contient des informations très utiles, a un beau design! Merci!

Ajouter un commentaire Fil des commentaires de ce billet

Faites un trackback

URL de rétrolien : http://blog.guillaumebizet.fr/trackback/115

aucune annexe



À Voir Également

Plugins Dotclear : screenshot

Dotclear 1 et 2 : un espace de présentation des plugins

Encore une bonne nouvelle Après avoir créé, un espace pour présenter et tester les thèmes ou ...

Lire la suite

Dotaddict : Accueil

Dotclear inaugure un espace de test pour les thèmes DC1 et DC2

Quelle bonne nouvelle !!! Dotclear inaugure aujourd'hui un espace d'hébergement et de test commun au ...

Lire la suite