[SPIP] v3.2.11 -> v3.2.12
[lhc/web/www.git] / www / ecrire / public / references.php
index 6a6116a..a4250bb 100644 (file)
@@ -98,6 +98,9 @@ function index_pile(
                $defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
        }
 
+       $idb_origine = $idb;
+       $nom_champ_origine = $nom_champ;
+
        $i = 0;
        if (strlen($explicite)) {
                // Recherche d'un champ dans un etage superieur
@@ -123,6 +126,8 @@ function index_pile(
                        if ($select and !in_array($t, $boucles[$idb]->select)) {
                                $boucles[$idb]->select[] = $t;
                        }
+                       // renseigner la boucle source de ce champ pour les traitements
+                       $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
                        $champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
                        if (!$joker) {
                                return index_compose($conditionnel, $champ);
@@ -700,13 +705,21 @@ function champs_traitements($p) {
        if (is_array($ps)) {
                // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
                $idb = index_boucle($p);
+               // si le champ a ete trouve dans une boucle parente sa source est renseignee ici
+               if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
+                       $idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
+               }
+
                // mais on peut aussi etre hors boucle. Se mefier.
                $type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
                $table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
 
                // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
                if ($type_requete and isset($GLOBALS['table_des_tables'][$type_requete])) {
+                       $type_alias = $type_requete;
                        $type_requete = $GLOBALS['table_des_tables'][$type_requete];
+               } else {
+                       $type_alias = false;
                }
 
                // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
@@ -715,6 +728,9 @@ function champs_traitements($p) {
                } // ou pour une boucle en particulier "DATA","articles"
                elseif ($type_requete and isset($ps[$type_requete])) {
                        $ps = $ps[$type_requete];
+               } // ou pour une boucle utilisant un alias ("hierarchie")
+               elseif ($type_alias and isset($ps[$type_alias])) {
+                       $ps = $ps[$type_alias];
                } // ou pour indiffĂ©remment quelle que soit la boucle
                elseif (isset($ps[0])) {
                        $ps = $ps[0];