Hello à tous,
J'ai mis en place un pseudo forum basé sur une structure par article spip
pour les têtes de topics et message forum spip pour les posts dans les
topics.
Si la structure fonctionne au niveau fonctionalités, j'ai quelques problèmes
dans les requetes que je fait pour aller checher ce dont j'ai besoin.
A coup de multiples boucles imbriquées, j'arrive à extraire ce que je veux,
mais ca génère des multiples requetes qui ne servent à rien.
En particulier pour le besoin suivant:
Sur la page de chaque partie du forum, je liste les topics, en cherchant à
les trier par date de dernier message posté, ou si il n'y en a aucun par
date de publication de l'article.
A l'heure actuelle, je ne peux pas faire ca, je fais donc deux listes:
- liste des topics avec réponses.
- liste des topics sans réponses.
Hors, j'ai un moyen de sortir mes infos via une requete SQL (un peu tordue,
je l'admets):
SELECT spip_articles.id_article, GREATEST(spip_articles.date,
COALESCE(forum.date_heure,0)) AS date_thread FROM spip_articles LEFT JOIN
spip_forum ON spip_forum.id_article = spip_articles.id_article WHERE (
spip_forum.statut = "publie" or spip_forum.statut IS NULL) AND
spip_articles.id_rubrique = 'ID_RUBRIQUE'
GROUP BY spip_articles.id_article
ORDER BY date_thread DESC
En dehors du fait que le LEFT JOIN me permet de lister TOUS les articles de
la rubrique, même ceux sans message dans le forum, je ne vais pas rentrer
plus dans les détails de la requete, et elle me sort ce dont j'ai besoin.
Vu que la requete se base sur un SELECT FROM spip_articles, je me suis dis,
essayons de rajouter un critère pour gérer tout celà.
Voici donc ce que j'ai rajouté comme critère dans mes_fonctions.php
function critere_topics($idb, &$boucles, $param, $not) {
$boucle = &$boucles[$idb];
$boucle->select[] = "GREATEST(spip_articles.date,
COALESCE(spip_forum.date_heure,0)) AS date_thread";
// $boucle->from[] = "LEFT JOIN spip_forum ON spip_forum.id_article =
spip_articles.id_article";
$boucle->where[] =
array("'OR'",array("'='","'spip_forum.statut'","'publie'"),array("'IS'","'spip_forum.statut'","'NULL'"));
$boucle->groupby[] = "spip_articles.id_article";
}
Et voilà mon problème:
Le from est commenté car j'ai BESOIN de faire une requete via un LEFT JOIN
et pas un WHERE + condition de jointure. C'est en effet la seule solution
qui me permet de récupérer les topics (articles) sans post (message de forum
avec statut publie)
J'ai essayé d'autres solutions, mais:
- Utiliser un $boucle->join ne me fait pas du tout ce dont j'ai besoin
- Utiliser les jointures automatiques via un <boucle_b(ARTICLES
spip_forum){topics}{id_rubrique}>#ID_ARTICLE #ID_THREAD</boucle_b> ne me
fait pas un left join mais une jointure via WHERE
Bref, impossible d'arriver à faire une LEFT JOIN via un critère et/ou une
boucle.
Et dans les recherches que j'ai pu faire, je ne trouve que des jointures
effectuées par conditions WHERE jamais de LEFT JOIN.
Sachant qu'il est impératif que la boucle déclanche un recyclage en cas de
message sur le forum (faut que j'arrive à trouver ce qui déclanche le
recyclage du cache et qu'est-ce qui se fait recycler mais ca c'est une autre
histoire je pense :D)
Anyway, SPIP est-il allergique aux bon vieux JOIN ?