#ENV = merci

Bonjour,
Mon code est finalement

<BOUCLE_anim(ADBDP){annee=#ENV{test}}{par num stats#ENV{test2}}{inverse}>

<table>
<tr>
<td class="td_champdef">[(#BDP|majuscules)]
</td>
<td class="td_valeurdef">

[(#ENV{test2}|=={1}|?{' '})#STATS1]
[(#ENV{test2}|=={10}|?{' '})#STATS10]
[(#ENV{test2}|=={11}|?{' '})#STATS11]
[(#ENV{test2}|=={12}|?{' '})#STATS12]
[(#ENV{test2}|=={2}|?{' '})#STATS2]
[(#ENV{test2}|=={3}|?{' '})#STATS3]
[(#ENV{test2}|=={30}|?{' '})#STATS30]
[(#ENV{test2}|=={31}|?{' '})#STATS31]
[(#ENV{test2}|=={32}|?{' '})#STATS32]
[(#ENV{test2}|=={33}|?{' '})#STATS33]
[(#ENV{test2}|=={4}|?{' '})#STATS4]
[(#ENV{test2}|=={5}|?{' '})#STATS5]
[(#ENV{test2}|=={6}|?{' '})#STATS6]
+ 600 autres lignes

Avec un tableur, en récupérant la structure de la base, cela n'a pas été trop dur à faire.
Merci à vous.
BS

Bernard Strainchamps wrote:

[(#ENV{test2}|=={1}|?{' '})#STATS1]
+ 600 autres lignes

tu ne pourrais pas te créer une fonction-filtre
dans mes_fonctions.php :

function mes_stats($arg) {
   return (intval($arg) > 0) ? '#STATS'.intval($arg) : '';
}

appelée dans le squelette :

[(#ENV{test2}|mes_stats)]

denisb wrote:

tu ne pourrais pas te créer une fonction-filtre
dans mes_fonctions.php :

tu pourrais.
mais ça ne servirait à rien d'autre qu'afficher un trés joli #STATSxx

à oublier donc.

denisb wrote:

à oublier donc.

en fait il faudrait une fonction-filtre :

function mes_stats($arg1, $arg2) {
   $row = spip_fetch_array(spip_query("SELECT stats.$arg1 AS retour FROM adbdp WHERE id = $arg2"));
   return $row['retour'];
}

appelée par :

<table>
<tr>
<td class="td_champdef">[(#BDP|majuscules)]</td>
<td class="td_valeurdef">[(#ENV{test2}|mes_stats{#ID})]</td>

mais ça donne un peu l'impression de réinventer la roue... (carrée ?)

denisb wrote:

en fait il faudrait une fonction-filtre :

derni^H^H^H (ne *jamais* dire 'dernière') correction
(la proposition précédente ne peut fonctionner) :

function mes_stats($arg1, $arg2) {
    $row = spip_fetch_array(spip_query(" SELECT stats{$arg1} AS retour FROM adbdp WHERE id = '$arg2' "));
    return ($row['retour'] ? $row['retour'] : '');
}

[(#ENV{test2}|mes_stats{#ID})]

Alors, la réponse d'ESJ à RealET est la bonne mais je ne suis pas convaincu par la solution qui en découle.

1- on peut avoir un *tri* sur un champ dynamique (mais pas avec num aux dernières nouvelles en 1.9.2)
2- le probleme levé par ESJ, c'est que le champ demandé n'est pas forcement remonté dans la boucle car le compilateur optimise les requetes (ce qui est indépendant des 2 autres problemes évoqués : maj/minuscule dans les noms des champs en base et tri dynamique avec num).

donc [(#ENV{#ENV{test3}})] marche très bien, le seul souci, c'est que le champ demandé n'est pas forcement dans la requete (il n'est d'ailleurs pas forcement dans la table...)

Donc 2 solutions pour etre sur qu'il y est:
1- => avoir la balise #XXX correspondante dans la boucle.
ce qui peut se faire tout simplement comme de plusieurs facons, la plus simple etant :
[(#STATS1|?)][(#STATS2|?)][(#STATS3|?)][(#STATS4|?)]
...
[(#ENV{#ENV{test3}})]

2- plus clean, en déclarant explicitement la boucle de facon à lui faire faire un "select *", soit sans doute (pas testé) :
function boucle_ADBDP($id_boucle, &$boucles) {
  $boucle = &$boucles[$id_boucle];
  $boucle->select[]= '*';
  return calculer_boucle($id_boucle, $boucles);
}

et la tu pourras faire :
spip.php?page=test15&test=2006&test2=stats4&test3=stats5
<BOUCLE_anim(ADBDP){annee=#ENV{test}}{par #ENV{test2}}{inverse}>
Contenu du champ [(#ENV{test3})] : [(#ENV{#ENV{test3}})]
</BOUCLE_anim>

@++