diff --git a/casse-noisettes.html b/casse-noisettes.html index be4c6312c0f9e85964b29e4de801b1fb90e526ff..c29d9dd227af7bfd9202147b31de0cc195ff45e1 100644 --- a/casse-noisettes.html +++ b/casse-noisettes.html @@ -38,6 +38,7 @@ <tr><td>#PETITION</td><td> #PETITION</td></tr> <tr><td>#POPULARITE</td><td> #POPULARITE</td></tr> <tr><td>#EXTRA</td><td> #EXTRA</td></tr> +<tr><td>#PARAMETRES_FORUM</td><td> #PARAMETRES_FORUM</td></tr> </table> <hr /> <table border='1' width='100%'> @@ -46,7 +47,7 @@ <tr><td>#TOTAL_BOUCLE</td><td><BOUCLE_TOTAL_BOUCLE(AUTEURS)> #TOTAL_BOUCLE</BOUCLE_TOTAL_BOUCLE></td></tr> <tr><td>#COMPTEUR_BOUCLE</td><td><BOUCLE_COMPTEUR_BOUCLE(AUTEURS)> #COMPTEUR_BOUCLE</BOUCLE_COMPTEUR_BOUCLE></td></tr> <tr><td>#EXPOSER</td><td><BOUCLE_EXPOSER(ARTICLES){1,1}> #EXPOSER</BOUCLE_EXPOSER></td></tr> -<tr><td>#LESAUTEURS</td><td><BOUCLE_LESAUTEURS(pgsql:ARTICLES){1,1}> #LESAUTEURS</BOUCLE_LESAUTEURS></td></tr> +<tr><td>#LESAUTEURS</td><td><BOUCLE_LESAUTEURS(ARTICLES){1,1}> #LESAUTEURS</BOUCLE_LESAUTEURS></td></tr> <tr><td>{titre=#NOM_SITE_SPIP}</td><td><BOUCLE_TITRE2(ARTICLES){id_rubrique}{id_article=#NOM_SITE_SPIP}{"<br />"}>#ID_ARTICLE #TITRE #NOM_SITE_SPIP</BOUCLE_TITRE2></td></tr> <tr><td>{id_article=#ID_RUBRIQUE}</td><td><BOUCLE1(RUBRIQUES){par id_rubrique}><BOUCLE_TITRE1(ARTICLES){id_rubrique}{id_article=#ID_RUBRIQUE}{"<br />"}>#ID_RUBRIQUE #ID_ARTICLE </BOUCLE_TITRE1><br />#TOTAL_BOUCLE</B_TITRE1> </BOUCLE1></td></tr> <tr><td>{titre=#TITRE*}</td><td><BOUCLE3(RUBRIQUES){par id_rubrique}><BOUCLE_TITRE3(ARTICLES){id_rubrique}{id_article=#TITRE*}{"<br />"}>#ID_RUBRIQUE #TITRE #ID_ARTICLE </BOUCLE_TITRE3></B_TITRE3> </BOUCLE3></td></tr> @@ -122,5 +123,13 @@ <tr><td>[[g1 (#TITRE) d1 [[g3 (#TITRE) d3] (#TITRE|strtoupper) [g4 (#TITRE) d4]]] (#TITRE|strtoupper) [g5 (#TITRE) d5]][g6 (#TITRE) d7]</td><td><BOUCLE_a(ARTICLES){1,1}> [[g1 (#TITRE)d1 [[g3 (#TITRE) d3] (#TITRE|strtoupper) [g4 (#TITRE) d4]]] (#TITRE|strtoupper) [g5 (#TITRE) d5]][g6 (#TITRE) d7]</td></tr></BOUCLE_a> </table> +<hr /> +<table border='1' width='100%'> +<tr><td colspan=2 align=center>Criteres de feu</td></tr> +<tr><td>{exclus}</td><td><BOUCLE_exclus(ARTICLES){1,1}{exclus}>#TITRE</td></tr></BOUCLE_exclus> +<tr><td>{doublons}</td><td><BOUCLE_doublons(ARTICLES){1,1}{doublons}>#TITRE</td></tr></BOUCLE_doublons> +<tr><td>{par}</td><td><BOUCLE_par(ARTICLES){1,1}{par titre}>#TITRE</td></tr></BOUCLE_par> +</table> + diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3 index 4cfb6867bf9297aad962006c0e2f6a1f34441fb5..3f3f32bddb94216d7739fec1104aadce14f9d9c4 100644 --- a/inc-compilo-index.php3 +++ b/inc-compilo-index.php3 @@ -112,7 +112,7 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') { } if (!$t) $t = $r; // pour les tables non Spip // $t est le nom PHP de cette table - #spip_log("Go: idb='$idb' r='$r' c='$c' nom='$nom_champ'"); +# spip_log("Go: idb='$idb' r='$r' c='$c' nom='$nom_champ' s=$s"); $desc = $tables_des_serveurs_sql[$s][$t]; if (!$desc) { include_local("inc-admin.php3"); diff --git a/inc-compilo.php3 b/inc-compilo.php3 index 5d89de9ab4da3930ea46615001c4b90c49adcf44..5b7fa901fa3538435c2e03d782499a65cde08d20 100644 --- a/inc-compilo.php3 +++ b/inc-compilo.php3 @@ -134,7 +134,7 @@ function calculer_texte($texte, $id_boucle, &$boucles, $id_mere) { // remplissant une variable $t0 retourne'e en valeur // function calculer_boucle($id_boucle, &$boucles) { - global $table_primary, $table_des_tables; + global $table_primary, $table_des_tables, $tables_des_serveurs_sql; $boucle = &$boucles[$id_boucle]; $type_boucle = $boucle->type_requete; @@ -152,7 +152,16 @@ function calculer_boucle($id_boucle, &$boucles) { if (!function_exists($f)) $f = $f.'_dist'; // definition spip if (!function_exists($f)) $f = 'boucle_DEFAUT'; // definition par defaut $id_table = $table_des_tables[$type_boucle]; - $id_field = $id_table . "." . $table_primary[$type_boucle]; + if ($id_table) { + $primary = $table_primary[$type_boucle]; + } else { // table non Spip. Pas mal l'indexation, hein ? + $id_table = $type_boucle; + $serveur = $boucle->sql_serveur; + $primary = $tables_des_serveurs_sql[$serveur ? $serveur : 'localhost'][$type_boucle]['key']["PRIMARY KEY"]; + } + + $id_field = $id_table . "." . $primary; # articles.id_article -> 'table_id' + spip_log($id_field); $f($boucle, $boucles, $type_boucle, $id_table, $id_field); @@ -177,21 +186,17 @@ function calculer_boucle($id_boucle, &$boucles) { // cas general ({lang_select} sur une table externe) . 'lang'; - // Qui sommes-nous ? - $primary_key = $table_primary[$type_boucle]; - // Calculer les invalideurs si c'est une boucle non constante $constant = ereg("^\(?'[^']*'\)?$",$return); - if ((!$primary_key) || $constant) + if ((!$primary) || $constant) $invalide = ''; else { - $id_table = $table_des_tables[$type_boucle]; - $boucle->select[] = "$id_table.$primary_key"; + $boucle->select[] = $id_field; - $invalide = "\n \$Cache['$primary_key']"; - if ($primary_key != 'id_forum') - $invalide .= "[\$Pile[\$SP]['$primary_key']] = 1;"; + $invalide = "\n \$Cache['$primary']"; + if ($primary != 'id_forum') + $invalide .= "[\$Pile[\$SP]['$primary']] = 1;"; else $invalide .= "[calcul_index_forum(" . // Retournera 4 [$SP] mais force la demande du champ a MySQL @@ -227,7 +232,7 @@ function calculer_boucle($id_boucle, &$boucles) { if ($boucle->doublons) $debut .= "\n \$doublons['".$boucle->doublons."'] .= ','. " . - index_pile($id_boucle, $primary_key, $boucles) + index_pile($id_boucle, $primary, $boucles) . "; // doublons"; // gestion optimale des separateurs et des boucles constantes @@ -304,11 +309,11 @@ function calculer_boucle($id_boucle, &$boucles) { // En absence de champ c'est un decompte : // on prend la primary pour avoir qqch // car le COUNT incompatible avec le cas general - // pour les tables sans primary, prendre * mais faudrait trouver mieux + $init .= "spip_abstract_select(\n\t\tarray(\"". (($boucle->select) ? join("\",\n\t\t\"", array_unique($boucle->select)) : - ((strlen($id_field) > 1) ? $id_field : '*')) . + $id_field) . '"), # SELECT array("' . join('","', array_unique($boucle->from)) . @@ -568,7 +573,7 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { if ($boucle->type_requete != 'boucle') { $descr['id_mere'] = $id; - $res = calculer_criteres($id, $boucles, $descr); + $res = calculer_criteres($id, $boucles); if (is_array($res)) return $res; # erreur $boucles[$id]->return = calculer_liste($boucle->milieu, diff --git a/inc-criteres.php3 b/inc-criteres.php3 index 33c76af3b1b53fcb0b9b64ebbc2c9f8a079e5bd6..4b3b73c6a4d9b9dce1a4479ba146a67defa988f5 100644 --- a/inc-criteres.php3 +++ b/inc-criteres.php3 @@ -300,14 +300,21 @@ function relations_externes ($type, $col) { // comme {1,4}, etc. // function calculer_criteres ($idb, &$boucles) { - global $tables_relations, $table_primary, $table_des_tables, $table_date; + global $tables_relations, $table_primary, $table_des_tables, $table_date, $tables_des_serveurs_sql; $boucle = &$boucles[$idb]; # nom de la boucle - $type = $boucle->type_requete; # articles $params = $boucle->param; - $id_table = $table_des_tables[$type]; # articles -> 'table' - $primary = $table_primary[$type]; # id_article -> 'id' - $id_field = $id_table . "." . $primary; # articles.id_article -> 'table_id' + if (!is_array($params)) return; // rien a faire + $type = $boucle->type_requete; # articles + $serveur = $boucle->sql_serveur; + $id_table = $table_des_tables[$type]; # articles -> 'table'; + if ($id_table) { + $primary = $table_primary[$type]; # id_article -> 'id' + } else { // table non Spip. Pas mal l'indexation, hein ? + $id_table = $type; + $primary = $tables_des_serveurs_sql[$serveur ? $serveur : 'localhost'][$type]['key']["PRIMARY KEY"]; + } + $id_field = $id_table . "." . $primary; # articles.id_article -> 'table_id' // les infos complementaires a passer aux fonctions critere_xxx $infos = array( 'type' => $type, # (articles) @@ -319,8 +326,6 @@ function calculer_criteres ($idb, &$boucles) { ); - if (!is_array($params)) return; // rien a faire - // Boucle hierarchie, supprimer le critere id_article/id_rubrique/id_syndic // qui est superfetatoire (mais indique dans la doc) if ($type == 'hierarchie') { @@ -418,7 +423,7 @@ function calculer_criteres ($idb, &$boucles) { // Si id_parent, comparer l'id_parent avec l'id_objet // de la boucle superieure if ($val == 'id_parent') - $val = $table_primary[$type]; + $val = $primary; // Si id_enfant, comparer l'id_objet avec l'id_parent // de la boucle superieure else if ($val == 'id_enfant') @@ -435,7 +440,7 @@ function calculer_criteres ($idb, &$boucles) { if ($s = relations_externes($type, $col)) { $col_table = $s; $boucle->from[] = "$col_table AS $col_table"; - $boucle->where[] = "$id_field=$col_table." . $table_primary[$type]; + $boucle->where[] = "$id_field=$col_table." . $primary; $boucle->group = $id_field; $boucle->lien = true; } @@ -451,7 +456,7 @@ function calculer_criteres ($idb, &$boucles) { $col_lien = $type; $boucle->from[] = "mots_$col_lien AS lien_mot"; $boucle->from[] = 'mots AS mots'; - $boucle->where[] = "$id_field=lien_mot." . $table_primary[$type]; + $boucle->where[] = "$id_field=lien_mot." . $primary; $boucle->where[] = 'lien_mot.id_mot=mots.id_mot'; $boucle->group = $id_field; $col_table = 'mots'; @@ -481,7 +486,7 @@ function calculer_criteres ($idb, &$boucles) { // Cas particulier : id_enfant => utiliser la colonne id_objet if ($col == 'id_enfant') - $col = $table_primary[$type]; + $col = $primary; // Cas particulier : id_secteur = id_rubrique pour certaines tables if (($type == 'breves' OR $type == 'forums') AND $col == 'id_secteur') $col = 'id_rubrique';