passer une variable à #EVAL

Bonjour,
Je viens de découvrir l'article http://www.weblog.eliaz.fr/article53.html qui me permet enfin de résoudre un problème de filtrage sur les dates de modifications sans introduire trop de lignes de php.
Je veux afficher les brèves modifiées sur les 60 derniers jours:
#SET{reference,#EVAL{date("Y-m-d",strtotime("-60days"))}}
<BOUCLE_brevesrecentes(BREVES){par maj}{inverse}{maj >= #GET{reference}>
....
</BOUCLE_brevesrecentes>
fait exactement ce que je veux.

Mais comme je vais le faire plusieurs fois dans le squelette (pour les articles, les documents, etc.), je voudrais mettre la valeur du nombre de jours au début dans une variable et passer cette variable aux différents #EVAL

Je n'ai pas trouvé comment mettre un #GET dans un #EVAL (qqch comme #EVAL{date("Y-m-d",strtotime("-#GET{delta}days"))} avec un #SET{delta,60} en début de squelette).

J'ai été surpris de constater qu'un #EVAL{$delta=60} en début de squelette permettait de créer une variable php conservée pendant toute l'interprétation du squelette (j'en veux bien une confirmation car ça ne me paraît pas normal), mais cet #EVAL provoque l'affichage du 60 sur le résultat final...

Comment faire proprement un passage de variable à #EVAL?
Olivier

Olivier Charade a écrit :

J'ai été surpris de constater qu'un #EVAL{$delta=60} en début de squelette permettait de créer une variable php conservée pendant toute l'interprétation du squelette (j'en veux bien une confirmation car ça ne me paraît pas normal), mais cet #EVAL provoque l'affichage du 60 sur le résultat final...

c'est normal car le php $var=val; renvoie val

pour éviter cela, tu peux probablment faire
#EVAL{$delta=60;$xxx=""}
(ou aussi bien , à la place de :wink:

Pour le reste, j'ai pas bien compris ton exposé.

JLuc

Merci de l'idée mais non: l'affectation est évaluée à la valeur affectée (conforme à la doc php que je suis allé relire pour l'occasion).
Après plusieurs essais, il y a qqch qui m'échappe dans le comportement de la balise #EVAL:
si je fais
#SET{delta,60}
#EVAL{$delta=#GET{delta}} (ce qui ne sert à rien, nous sommes d'accord)
l'évaluation se fait correctement et je vois s'afficher 60
Mais sur
#SET{delta,60}
#EVAL{dat("Y-m-d",strtotime("-#GET{delta}day"))}
spip n'arrive pas à remplacer le #GET par sa valeur dans l'#EVAL.
Y-aurait-il une astuce pour permettre au #GET de s'effectuer dans cette instruction?

Dans un squelette "normal", je pourrais m'en tirer en mettant mon #EVAL{$delta=#GET{delta}} dans un bloc div avec display:none, mais il se trouve que c'est un patron pour spip-listes et que la version texte du courrier ne tient pas compte du display:none.

Olivier

At 17:30 14/10/2009, JLuc wrote:

Olivier Charade a écrit :

J'ai été surpris de constater qu'un #EVAL{$delta=60} en début de squelette permettait de créer une variable php conservée pendant toute l'interprétation du squelette (j'en veux bien une confirmation car ça ne me paraît pas normal), mais cet #EVAL provoque l'affichage du 60 sur le résultat final...

c'est normal car le php $var=val; renvoie val

pour éviter cela, tu peux probablment faire
#EVAL{$delta=60;$xxx=""}
(ou aussi bien , à la place de :wink:

Pour le reste, j'ai pas bien compris ton exposé.

JLuc

_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

Olivier Charade a écrit :

Merci de l'idée mais non: l'affectation est évaluée à la valeur affectée (conforme à la doc php que je suis allé relire pour l'occasion).

hum...

en faisant un peu plus simple :
   #SET{delta, -60 days}
   [(#VAL{Y-m-d}|date{#VAL{#GET{delta}}|strtotime})]

ça le ferait pas ça ?
(je sais bien que oui, hein...)

Olivier Charade a écrit :

Merci de l'idée mais non: l'affectation est évaluée à la valeur affectée (conforme à la doc php que je suis allé relire pour l'occasion).
Après plusieurs essais, il y a qqch qui m'échappe dans le comportement de la balise #EVAL:
si je fais
#SET{delta,60}
#EVAL{$delta=#GET{delta}} (ce qui ne sert à rien, nous sommes d'accord)
l'évaluation se fait correctement et je vois s'afficher 60
Mais sur
#SET{delta,60}
#EVAL{dat("Y-m-d",strtotime("-#GET{delta}day"))}
spip n'arrive pas à remplacer le #GET par sa valeur dans l'#EVAL.
Y-aurait-il une astuce pour permettre au #GET de s'effectuer dans cette instruction?

peut etre avec des parenthèses autour du (#GET{xxx}) (mais pas les crochets)

denisb a écrit :

en faisant un peu plus simple :

simplifions, simplifions !

   #SET{delta, -60days}
   [(#VAL{Y-m-d}|date{#GET{delta}|strtotime})]

Merci beaucoup, toutes les solutions proposées fonctionnent!
je résume:
mettre des parenthèses autour du #GET à l'intérieur du #EVAL résoud mon problème en gardant ma syntaxe.

  #SET{delta, -60 days}
   [(#VAL{Y-m-d}|date{#VAL{#GET{delta}}|strtotime})]
(ou sans le second #VAL)
fait la même chose mais si ce n'est pas pour afficher directement le résultat, il faut supprimer les [(... )], soit:
#SET{reference,#VAL{Y-m-d}|date{#VAL{#GET{delta}}|strtotime}}

Cette solution, que je n'aurais jamais imaginée, suppose de savoir sérieusement comment un filtre spip se sert des fonctions php de même nom. Il n'y a que ceux qui ont soulevé le capot et passé du temps dans le moteur qui peuvent trouver ça.
Chapeau!
Olivier

At 10:59 15/10/2009, Stephane wrote:

Olivier Charade a écrit :

Merci de l'idée mais non: l'affectation est évaluée à la valeur affectée (conforme à la doc php que je suis allé relire pour l'occasion).
Après plusieurs essais, il y a qqch qui m'échappe dans le comportement de la balise #EVAL:
si je fais
#SET{delta,60}
#EVAL{$delta=#GET{delta}} (ce qui ne sert à rien, nous sommes d'accord)
l'évaluation se fait correctement et je vois s'afficher 60
Mais sur
#SET{delta,60}
#EVAL{dat("Y-m-d",strtotime("-#GET{delta}day"))}
spip n'arrive pas à remplacer le #GET par sa valeur dans l'#EVAL.
Y-aurait-il une astuce pour permettre au #GET de s'effectuer dans cette instruction?

peut etre avec des parenthèses autour du (#GET{xxx}) (mais pas les crochets)
_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

Olivier Charade a écrit :

Merci de l'idée mais non: l'affectation est évaluée à la valeur affectée (conforme à la doc php que je suis allé relire pour l'occasion).

oui bien entendu,
mais apparemment tu as omis de lire la doc des opérateus ; et ,

car avec #EVAL{$delta=60;$xxx=""}
tu as 2 opérations à la suite... (idem avec , à la place de ; )

JLuc