[SPIP Zone] notation

j'ai testé sur deux serveurs différents php4 mysql 5.0.20 et php5 mysql 5.0.51
en spip 2.09 vierge avec juste cfg et notation

la boucle (DOCUMENTS){id_article}{notation){!par moyenne}
j'ai le même message d'erreur
--> Unknown column 'notations.note'

var_profile dit
mysql_query(): Unable to save result set in mysql.php on line 154
$r = $link ? mysql_query($query, $link) : mysql_query($query);

(ARTICLES){id_rubrique}{notation){!par moyenne} fonctionne

à part la poisse :wink: quelqu'un a une idée? merci

Le 22/08/2009 17:21, Pi r a écrit :

j'ai testé sur deux serveurs différents php4 mysql 5.0.20 et php5 mysql
5.0.51
en spip 2.09 vierge avec juste cfg et notation

la boucle (DOCUMENTS){id_article}{notation){!par moyenne}
j'ai le même message d'erreur
--> Unknown column 'notations.note'

OK, on vient de confirmer le bug : pour tester :
+ cfg, notations, et squelette basique avec des documents :

<BOUCLE_art(ARTICLES){!par date}>
<br />ida #ID_ARTICLE : #TITRE<br />

<BOUCLE_docs(DOCUMENTS){id_article}{notation}{mode IN document,image}{!par moyenne}>
id #ID_DOCUMENT titre #TITRE<br />
</BOUCLE_docs>

</BOUCLE_art>

La requete générée n'a pas la table «notations» dans les FROM et génère une erreur :
SELECT
COUNT(notations.note) AS nombre_votes,
ROUND(AVG(notations.note),2) AS moyenne,
ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/1)),2) AS moyenne_ponderee,
documents.id_document,
documents.titre

FROM spip_documents AS `documents`
LEFT JOIN spip_documents_liens AS l ON documents.id_document=l.id_document
LEFT JOIN spip_articles AS aa ON (l.id_objet=aa.id_article AND l.objet='article')
LEFT JOIN spip_breves AS bb ON (l.id_objet=bb.id_breve AND l.objet='breve')
LEFT JOIN spip_rubriques AS rr ON (l.id_objet=rr.id_rubrique AND l.objet='rubrique')
LEFT JOIN spip_forum AS ff ON (l.id_objet=ff.id_forum AND l.objet='forum')
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )

WHERE ((aa.statut = 'publie' AND aa.date<='9999-12-31') OR bb.statut = 'publie' OR rr.statut = 'publie' OR ff.statut='publie')
AND (documents.taille > 0 OR documents.distant='oui')
AND (L1.id_objet = 22) AND (L1.objet = 'article')
AND ((documents.mode IN ('document','image')))
GROUP BY documents.id_document,documents.id_document
ORDER BY moyenne DESC

Unknown column 'notations.note' in 'field list'

-----------------------------------------
Solution bancale : activer «médiathèque»
----------------------------------------

Par contre, activer le plugin gestion_documents (médiathèque) résous le problème, la requete devient correcte. POURQUOI donc ?

SELECT
COUNT(notations.note) AS nombre_votes,
ROUND(AVG(notations.note),2) AS moyenne,
ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/30)),2) AS moyenne_ponderee,
documents.id_document,
documents.titre

FROM spip_documents AS `documents`
LEFT JOIN spip_notations AS notations ON (notations.id_objet=documents.id_document AND notations.objet='document')
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )

WHERE ((documents.statut = "publie"))
AND (documents.date_publication < '9999-12-31')
AND (documents.taille > 0 OR documents.distant='oui')
AND (L1.id_objet = 2)
AND (L1.objet = 'article')
AND ((documents.mode IN ('document','image')))
GROUP BY documents.id_document
ORDER BY moyenne DESC

Cédric, tu as une idée de pourquoi ta requête est plus courte, jolie, fonctionnelle et intelligente ?

--
MM.

Matthieu Marcillaud a écrit :

Cédric, tu as une idée de pourquoi ta requête est plus courte, jolie, fonctionnelle et intelligente ?

médiathèque redéfinit boucle_DOCUMENTS()

sans médiathèque, notations tourne avec :
   $boucle->from[$id_table] = ...
de public/boucles.php

avec médiathèque, ça tourne avec :
   return calculer_boucle($id_boucle, $boucles);
de gestdoc_fonctions.php

Cédric, tu as une idée de pourquoi ta requête est plus courte, jolie, fonctionnelle et intelligente ?

Parce que j'ai tout recodé peut être ? :stuck_out_tongue:

Cédric

Cédric, tu as une idée de pourquoi ta requête est plus courte, jolie,
fonctionnelle et intelligente ?

Parce que j'ai tout recodé peut être ? :stuck_out_tongue:

Ou parce qu'il y a un champ statut qui permet de se passer de la
jointure monstrueuse du core

-- Fil

Le 22 août 09 à 18:57, Matthieu Marcillaud a écrit :

Le 22/08/2009 17:21, Pi r a écrit :

j'ai testé sur deux serveurs différents php4 mysql 5.0.20 et php5 mysql
5.0.51
en spip 2.09 vierge avec juste cfg et notation

la boucle (DOCUMENTS){id_article}{notation){!par moyenne}
j'ai le même message d'erreur
--> Unknown column 'notations.note'

OK, on vient de confirmer le bug : pour tester :
...
Par contre, activer le plugin gestion_documents (médiathèque) résous le problème, la requete devient correcte. POURQUOI donc ?

SELECT
COUNT(notations.note) AS nombre_votes,
ROUND(AVG(notations.note),2) AS moyenne,
ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/30)),2) AS moyenne_ponderee,
documents.id_document,
documents.titre

FROM spip_documents AS `documents`
LEFT JOIN spip_notations AS notations ON (notations.id_objet=documents.id_document AND notations.objet='document')
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )

Dans le plugin notations l'écriture suivante est erronée et abusive

  $boucle->from[$boucle->id_table] .= " LEFT JOIN spip_notations AS notations
    ON (notations.id_objet=$id_table AND notations.objet='.sql_quote($objet).')";

Il faut écrire quelque chose du genre

// le format de join est :
// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
$boucle->join['notations'] = array("spip_notations",$boucle->primary);
$boucle->from_type['notations'] = "LEFT";

Cédric

Le 22/08/2009 22:23, cedric.morin@yterium.com a écrit :

Dans le plugin notations l'écriture suivante est erronée et abusive

$boucle->from[$boucle->id_table] .= " LEFT JOIN spip_notations AS notations
ON (notations.id_objet=$id_table AND
notations.objet='.sql_quote($objet).')";

Il faut écrire quelque chose du genre

// le format de join est :
// array(table depart, cle depart [,cle arrivee[,condition optionnelle
and ...]])
$boucle->join['notations'] = array("spip_notations",$boucle->primary);
$boucle->from_type['notations'] = "LEFT";

Ok, je vais regarder cela. J'étais persuadé d'avoir volé ce code chez un plugin à toi, mais je ne retrouve pas, donc j'ai du rêver et gaffer effectivement.

Cependant, si tu as quelques lignes à me consacrer, j'aimerais bien une explication de pourquoi «l'écriture suivante est erronée et abusive» (ce que j'accepte de bonne grâce !). Il y a plusieurs plugins qui définissent un «$boucle->from[$id_table]» mais effectivement plutôt dans des définitions de boucle que de critère. J'en conclue que ça ne peut être utilisé que pour définir sa propre boucle, et pas dans un critère pouvant s'appliquer sur des boucles différentes.

Enfin, comment connais-tu «from_type» qui n'est utilisé nulle part sur la zone ! Ni dans le core (mais y est bien défini) ! Moi je dis chapeau (pointu).

--
MM.

Le 23/08/2009 09:18, Matthieu Marcillaud a écrit :

Le 22/08/2009 22:23, cedric.morin@yterium.com a écrit :

Il faut écrire quelque chose du genre

// le format de join est :
// array(table depart, cle depart [,cle arrivee[,condition optionnelle
and ...]])
$boucle->join['notations'] = array("spip_notations",$boucle->primary);
$boucle->from_type['notations'] = "LEFT";

Ok, je vais regarder cela.

Ok, ça donne Connexion · GitLab avec quelques adaptations. J'ai du mal avec l'ordre des arguments, mais ça semble coller. Merci.

--
MM.

Matthieu Marcillaud a écrit :

Le 23/08/2009 09:18, Matthieu Marcillaud a écrit :

Le 22/08/2009 22:23, cedric.morin@yterium.com a écrit :

Il faut écrire quelque chose du genre

// le format de join est :
// array(table depart, cle depart [,cle arrivee[,condition optionnelle
and ...]])
$boucle->join['notations'] = array("spip_notations",$boucle->primary);
$boucle->from_type['notations'] = "LEFT";

Ok, je vais regarder cela.

Ok, ça donne Connexion · GitLab avec quelques adaptations. J'ai du mal avec l'ordre des arguments, mais ça semble coller. Merci.

çela résout le problème généré chez moi par la boucle (DOCUMENTS){id_article}{notation}{!par moyenne}
merci

Le 23 août 09 à 09:18, Matthieu Marcillaud a écrit :

Le 22/08/2009 22:23, cedric.morin@yterium.com a écrit :

Dans le plugin notations l'écriture suivante est erronée et abusive

$boucle->from[$boucle->id_table] .= " LEFT JOIN spip_notations AS notations
ON (notations.id_objet=$id_table AND
notations.objet='.sql_quote($objet).')";

Il faut écrire quelque chose du genre

// le format de join est :
// array(table depart, cle depart [,cle arrivee[,condition optionnelle
and ...]])
$boucle->join['notations'] = array("spip_notations",$boucle->primary);
$boucle->from_type['notations'] = "LEFT";

Ok, je vais regarder cela. J'étais persuadé d'avoir volé ce code chez un plugin à toi, mais je ne retrouve pas, donc j'ai du rêver et gaffer effectivement.

Cependant, si tu as quelques lignes à me consacrer, j'aimerais bien une explication de pourquoi «l'écriture suivante est erronée et abusive» (ce que j'accepte de bonne grâce !). Il y a plusieurs plugins qui définissent un «$boucle->from[$id_table]» mais effectivement plutôt dans des définitions de boucle que de critère. J'en conclue que ça ne peut être utilisé que pour définir sa propre boucle, et pas dans un critère pouvant s'appliquer sur des boucles différentes.

Non, c'est juste qu'un from['truc'] ne peut etre écrit que par une seule fonction sous peine de ne pas être reproductible ni garanti.
Donc on ne peut qu'ajouter des entrées dans le tableau from, pas modifier ni supprimer des entrées déjà existantes.

Enfin, comment connais-tu «from_type» qui n'est utilisé nulle part sur la zone ! Ni dans le core (mais y est bien défini) !

Je crois que c'est un ajout de renato pour permettre des jointures specifiees

Cédric