Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
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
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.
- les règles du forum : http://forum.dotclear.net/viewtopic.php?id=39494
- la galaxie de Dotclear 2 : http://fr.dotclear.org/documentation/2.0/links
Hors ligne
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 ?
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
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
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
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.
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)
- les règles du forum : http://forum.dotclear.net/viewtopic.php?id=39494
- la galaxie de Dotclear 2 : http://fr.dotclear.org/documentation/2.0/links
Hors ligne
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
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
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)
- les règles du forum : http://forum.dotclear.net/viewtopic.php?id=39494
- la galaxie de Dotclear 2 : http://fr.dotclear.org/documentation/2.0/links
Hors ligne
ah bé oui, c'est plus élégant ;)
Hors ligne
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
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
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)
- les règles du forum : http://forum.dotclear.net/viewtopic.php?id=39494
- la galaxie de Dotclear 2 : http://fr.dotclear.org/documentation/2.0/links
Hors ligne
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).