Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2012-02-11 06:40:08

fix
Membre
Inscription : 2005-01-20
Site Web

Liste de billets par ordre de dernier commentaire

Bonjour !

Je cherche à ajouter, sur un blog, la liste des derniers billets ayant reçu des commentaires.
Cela suppose (à moins qu'il y ait un autre moyen ?) de jouer à la fois sur la table "post" et la table "comment" : on sélectionne tous les billets ayant reçu au moins un commentaire dans la table "post", puis on les trie en fonction de la date des commentaires qui figure dans la table "comment". Voici ce que ça donne :

$params['from'] = "JOIN dc_comment T ON T.post_id = P.post_id ";
$params['sql'] = "AND P.nb_comment > 0 ";
$params['order'] = "T.comment_dt DESC";
$_ctx->posts = $core->blog->getPosts($params);

Mon problème est qu'avec cette méthode, il y a des doublons : je vais me retrouver avec trois fois le même billet, s'il a reçu trois commentaires, alors que, moi, je souhaiterais que chaque billet n'apparaisse qu'une seule fois !

Quelqu'un pourrait-il m'aider ? D'avance, merci !

Dernière modification par fix (2012-02-11 06:40:42)

Hors ligne

#2 2012-02-11 12:16:59

Moe
Responsable du mini-bar
Lieu : France
Inscription : 2004-09-19
Site Web

Re : Liste de billets par ordre de dernier commentaire

Bonjour,
il y a le champ "nb_comment" dans la table des billets. C'est celui qui est mis à jour quand on clique sur "Réinitialiser les compteurs des commentaires et rétroliens" dans le plugin "Maintenance", entre autres.

Sinon tu aurais aussi pu utiliser la commande SQL GROUP BY(Réinitialiser les compteurs des commentaires et rétroliens) pour n'avoir qu'un enregistrement par billet.

Hors ligne

#3 2012-02-11 14:20:31

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Liste de billets par ordre de dernier commentaire

Moe a écrit :

Bonjour,
il y a le champ "nb_comment" dans la table des billets. C'est celui qui est mis à jour quand on clique sur "Réinitialiser les compteurs des commentaires et rétroliens" dans le plugin "Maintenance", entre autres.

Je ne comprends pas bien : en quoi cela me permettrait-il de n'afficher qu'une seule fois les billets ayant reçu des commentaires récents ?
J'ai l'impression que ma question a été mal comprise... ou peut-être que quelque chose m'échappe ?

Moe a écrit :

Sinon tu aurais aussi pu utiliser la commande SQL GROUP BY(Réinitialiser les compteurs des commentaires et rétroliens) pour n'avoir qu'un enregistrement par billet.

Là encore, je ne comprends pas bien : quel rapport entre "la commande SQL GROUP BY" et "Réinitialiser les compteurs" ?

Hors ligne

#4 2012-02-11 14:46:52

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : Liste de billets par ordre de dernier commentaire

J'essaierais un truc comme

$params['sql'].= "AND T.comment_dt = (SELECT max(T.comment_dt)";

Sinon avec un GROUP BY P.post_id.


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#5 2012-02-11 15:05:48

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Liste de billets par ordre de dernier commentaire

Si j'ajoute :

$params['sql'] = "GROUP BY P.post_id ";

j'ai des erreurs du genre :

Fatal error: Uncaught exception 'Exception' with message 'ERROR: column "u.user_name" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ..._comment, post_open_tb, nb_comment, nb_trackback, U.user_nam... ^'

J'ajoute donc :

$params['sql'] = "GROUP BY P.post_id, U.user_name, U.user_firstname, U.user_displayname, U.user_email, U.user_url, C.cat_title, C.cat_url, C.cat_desc, T.comment_dt ";

Et du coup, j'ai de nouveau mes doublons :(

J'ai aussi essayé d'ajouter :

$params['sql'].= "AND T.comment_dt = (SELECT max(T.comment_dt)";

Mais ça me donne une autre erreur :

Fatal error: Uncaught exception 'Exception' with message 'ERROR: syntax error at end of input LINE 1: ...omment_dt = (SELECT max(T.comment_dt) ORDER BY post_dt DESC ^'

Dernière modification par fix (2012-02-11 15:06:01)

Hors ligne

#6 2012-02-11 15:42:42

Moe
Responsable du mini-bar
Lieu : France
Inscription : 2004-09-19
Site Web

Re : Liste de billets par ordre de dernier commentaire

fix a écrit :

Je ne comprends pas bien : en quoi cela me permettrait-il de n'afficher qu'une seule fois les billets ayant reçu des commentaires récents ?

Autant pour moi, j'ai mal compris la question.

fix a écrit :

Là encore, je ne comprends pas bien : quel rapport entre "la commande SQL GROUP BY" et "Réinitialiser les compteurs" ?

Il n'y a aucun rapport, j'ai raté un copier-coller. -_-

Je te suggère de regarder comment le widget "Derniers commentaires" fonctionne, ou même plus simple : insérer le widget dans ton fichier template.

Edit : sauf qu'il y aura plusieurs fois un même billet …

Dernière modification par Moe (2012-02-11 15:45:27)

Hors ligne

#7 2012-02-11 15:49:28

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Liste de billets par ordre de dernier commentaire

Moe a écrit :

Edit : sauf qu'il y aura plusieurs fois un même billet …

Donc... je ne suis pas plus avancé :) C'est gentil, néanmoins, d'avoir essayé d'aider !

Hors ligne

#8 2012-02-11 16:37:19

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Liste de billets par ordre de dernier commentaire

Il me semble que tu peux traiter les doublons juste après avoir récupéré la liste des billets en lisant le recordset ainsi :

$rs = $core->blog->getPosts($params);
$posts_list = array();
while ($rs->fetch()) {
   ici tu récupères le post_id, et s'il n'est pas déjà dans $posts_list tu l'y ajoutes (pour ne pas le traiter lors de la prochaine itération) et tu récupères le dernier commentaire
}

enfin c'est l'idée ;)

Hors ligne

#9 2012-02-11 16:52:55

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Liste de billets par ordre de dernier commentaire

PS : je crois que ça marcherait comme ça :

$rs = $core->blog->getPosts($params);
$commented_posts = array();

while ($rs->fetch()) {
   if (!in_array($rs->post_id,$commented_posts)) { 
      $commented_posts[] = $rs->post_id;
      echo $rs->post_title;
   }
}

mais je n'ai pas testé...

Hors ligne

#10 2012-02-11 17:03:41

Moe
Responsable du mini-bar
Lieu : France
Inscription : 2004-09-19
Site Web

Re : Liste de billets par ordre de dernier commentaire

En mixant toutes les propositions :

$params['limit'] = 10;
$params['order'] = 'MAX(comment_dt) DESC';
$params['sql'] = " GROUP BY P.post_id ";
$rs = $core->blog->getComments($params);

while ($rs->fetch())
{
print('<a href="'.$rs->getPostURL().'">'.html::escapeHTML($rs->post_title).'</a><br />');
}

Dernière modification par Moe (2012-02-11 17:07:40)

Hors ligne

#11 2012-02-11 17:08:04

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Liste de billets par ordre de dernier commentaire

ah bé oui, c'est plus élégant ;)

Hors ligne

#12 2012-02-11 17:28:13

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : Liste de billets par ordre de dernier commentaire

fix a écrit :

Si j'ajoute :
[
J'ai aussi essayé d'ajouter :

$params['sql'].= "AND T.comment_dt = (SELECT max(T.comment_dt)";

Mais ça me donne une autre erreur :

Fatal error: Uncaught exception 'Exception' with message 'ERROR: syntax error at end of input LINE 1: ...omment_dt = (SELECT max(T.comment_dt) ORDER BY post_dt DESC ^'

C'est normal, deux parenthèse ouvrantes et une seule fermante, y'a une boulette dans le code :), mais bon, c'était pour l'idée de la requette à mettre en forme ;)

$params['sql'].= "AND T.comment_dt = SELECT max(T.comment_dt)";

Dernière modification par adjaya (2012-02-11 17:28:37)


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#13 2012-02-11 18:05:52

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Liste de billets par ordre de dernier commentaire

adjaya > avec :

$params['sql'].= "AND T.comment_dt = SELECT max(T.comment_dt)";

J'ai :

Fatal error: Uncaught exception 'Exception' with message 'ERROR: syntax error at or near "SELECT" LINE 1: ...ULL ) ) AND post_type = 'post' AND T.comment_dt = SELECT max... ^'

Moe > Tu utilises la fonction getComments, alors que j'ai besoin de getPosts ;) En effet, j'utilise, dans la suite de ma fonction, $_ctx->posts->getURL(), $_ctx->posts->post_excerpt_xhtml, $_ctx->posts->post_content_xhtml et $_ctx->posts->post_title.

Hors ligne

#14 2012-02-12 08:58:20

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Liste de billets par ordre de dernier commentaire

J'ai opté pour la solution proposée par amalgame en #9... Et ça fonctionne parfaitement !

Un grand merci à tous.

Hors ligne

#15 2012-02-12 14:24:00

Moe
Responsable du mini-bar
Lieu : France
Inscription : 2004-09-19
Site Web

Re : Liste de billets par ordre de dernier commentaire

fix a écrit :

Moe > Tu utilises la fonction getComments, alors que j'ai besoin de getPosts ;) En effet, j'utilise, dans la suite de ma fonction, $_ctx->posts->getURL(), $_ctx->posts->post_excerpt_xhtml, $_ctx->posts->post_content_xhtml et $_ctx->posts->post_title.

La fonction $rs->getPostURL() fonctionne et $rs->post_title renvoie bien le titre du billet. C'est bien ce que tu demandes non ?

A priori ça doit fonctionner :

$params['limit'] = 10;
$params['order'] = 'MAX(comment_dt) DESC';
$params['sql'] = " GROUP BY P.post_id ";
$_ctx->posts = $core->blog->getComments($params);

...

L'avantage de la méthode que je propose c'est qu'elle renverra toujours 10 titres de billets puisque le comptage se fait après avoir éliminé les doublons.

Dernière modification par Moe (2012-02-12 14:25:41)

Hors ligne

#16 2012-02-12 15:34:13

fix
Membre
Inscription : 2005-01-20
Site Web

Re : Liste de billets par ordre de dernier commentaire

Moe a écrit :

La fonction $rs->getPostURL() fonctionne et $rs->post_title renvoie bien le titre du billet.

Comme je l'ai écrit juste avant, j'ai également besoin, dans la suite de ma fonction, de $_ctx->posts->getURL(), $_ctx->posts->post_excerpt_xhtml et $_ctx->posts->post_content_xhtml.
Il s'agit, en effet, de récupérer (en dynamique : ma méthode est expliquée ici) et d'afficher les images correspondant aux billets ayant récemment reçu des commentaires.

Edit : le résultat est visible ici, sous le titre "C'est vous qui le dites !"

Dernière modification par fix (2012-02-12 15:36:19)

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map