Pour info, strtotime() permet d'utiliser des paramètres comme "next Thursday" ou "+2 days" pour éviter de se planter dans les calculs:
Le 12/06/2014 16:35, Bur. Roger Burton a écrit :
Bonjour,
Ça peut être utile :
3 fonctions qui servent de filtres sur des balises « date »
Il y a moyen de simplifier les écritures SPIP en passant par des filtres « maison »
À placer dans « mes_options.php »
//début de semaine à partir d'une date
function debut_semaine($date) {
$ladate = strtotime($date);
return date('Y-m-d',$ladate - (24*3600*date('w',$ladate)));
}
//fin de semaine à partir d'une date
function fin_semaine($date) {
$ladate = strtotime($date);
return date('Y-m-d',$ladate + (24*3600*(6-date('w',$ladate))));
}
// numéro de semaine à partir d'une date
function semaine($date) {
$ts = strtotime($date);
if (date('w',$ts) == 0) {
//commencer la semaine le Dimanche pour que ca colle
//avec les deux autres filtres.
return (date('W',$ts)-1)%52;
} else {
return date('W',$ts);
}
}
RB
*De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
*Envoyé :* jeudi 12 juin 2014 16:17
*À :* Liste SPIP User
*Objet :* Re: [Spip] Variables globales
En fait, je suis en train de faire le site d'un cinéma: http://image.cousumain.info (en chantier)
Du coup, je construis la grille à partir de la date d'aujourd'hui avec des tests pour savoir si on est mercredi (ou sinon pour trouver mercredi dernier), des calculs (pour J+1, J+2), quel est le numéro de jour dans la semaine (jour mis en avant) et en utilisant le plugin Séances...
Bref, un joyeux chantier de crochets, d'accolades et de parenthèses 
Mais peut être que je ne peux tout simplement pas utiliser les variables globales. C'était avant tout pour simplifier mon code, mais visiblement, ça le complique par ailleurs...
Merci en tout cas d'avoir pris le temps de répondre à mes questions...
jean marie
Le 12/06/2014 15:43, jouannin cedric a écrit :
Bonjour Jean-Marie,
OK, je cerne mieux tes besoins avec les exemples spécifiés.
La déclaration d'une variable globale PHP n'est peut-être pas la
meilleure solution.
Effectivement, dans ton cas précis, la balise #EVAL posera
problème pour des tests ou filtres si des crochets sont insérés
dedans, ce qui est le cas avec {$GLOBALS['jour_aujourdhui'], car
ceux-ci semblent provoquer des incompatibilités avec le syntaxe de
délimitation des bornes de balises SPIP : [(#BALISE_SPIP)].
En analysant tes exemples, il semble que tes besoins de variable
globale soient liés à la notion de date, retournée avec une
contrainte de format.
Il te serait peut-être plus simple d'utiliser la balise SPIP
#DATE, avec les filtres de date adaptés, qui permettront de
retourner la date dans les mêmes formats que dans tes exemples,
par exemple [(#DATE|affdate{'Y-m-d 00:00:00'})]permettait de
remplacer ta variable globale
$GLOBALS ['jour0'] = date('Y-m-d 00:00:00',date('U'));.
Après, ton idée de variable globale est peut-être liée au fait que
la balise #DATE découle du contexte de boucle courante, et
retourne donc soit la date du jour (si présent en dehors de toute
boucle), soit la date du dernier article par exemple (si présent
dans une boucle ARTICLE), ce qui pouvait te poser problème si tu
souhaitais qu'elle ne retourne que la date du jour, quel que soit
le contexte.
Si tel est le cas, le plugin « Couteau suisse » pourrait être une
bonne solution.
En dehors de toutes les fonctionnalités bien utiles qu'il propose
(cryptage des adresses email, ajout de raccourcis typographiques,
...), l'option « Trousse à balises » (dans « Balises, filtres et
critères ») permet notamment d'ajouter une nouvelle balise
#MAINTENANT, indépendante de tout contexte de boucle, qui retourne
systématiquement la date courante.
Il te suffirait d'utiliser dans tes squelettes cette balise avec
les filtres de date adaptés, comme évoqué ci-dessus, par exemple
[(#MAINTENANT|affdate{'Y-m-d 00:00:00'})], et cela ne devrait plus
poser de problème d'incompatibilité avec la syntaxe des tests SPIP.
Voilà, cela me semblerait plus propre ainsi.
Cordialement,
Cédric JOUANNIN
*De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
*Envoyé :* jeudi 12 juin 2014 14:43
*À :* Liste SPIP User
*Objet :* Re: [Spip] Variables globales
Salut Cédric,
merci pour ta réponse, ça fonctionne effectivement...
Par contre, je n'arrive pas à appliquer des filtres ni à faire des
tests avec #EVAL (si tout marchait du 1er coup, ça serait pas
marrant
).
*Le test avec ma variable 'jour_aujourdhui' (qui est une date):*
Dans mes_options.php : $GLOBALS ['jour_aujourdhui'] = date("w");
(retourne le numéro du jour dans la semaine : jeudi = 4)
Dans mon squelette :
[(#EVAL{$GLOBALS['jour_aujourdhui']}|=={4}|?{'oui','non'})] ne
fonctionne pas.
Par contre, si je passe par une variable locale, le test fonctionne:
#SET{variable_locale,#EVAL{$GLOBALS['jour_aujourdhui']}}
[(#GET{variable_locale}|=={3}|?{'oui','non'})]
*Idem pour les filtres: je veux sortir les numéros des jours (pas
qu'aujourd'hui) dans le mois*
Dans mes_options.php : $GLOBALS ['jour0'] = date('Y-m-d
00:00:00',date('U')); (retourne la date sous la forme Y-m-d 00:00:00)
Dans mon squelette : [(#EVAL{$GLOBALS['jour0']}|affdate)] ne
fonctionne pas
Par contre, via une variable, pas de problème:
#SET{variable_locale,#EVAL{$GLOBALS['jour0']}}
[(#GET{variable_locale}|jour)]
Ca doit être lié à ma syntaxe, mais je ne trouve pas...
Et les , {} et () commencent à se mélanger dans mon cerveau 
Merci,
jean marie
Le 11/06/2014 17:20, jouannin cedric a écrit :
Bonjour Jean-Marie,
Effectivement, il y a plus simple sans créer de balise SPIP.
Tu peux récupérer une variable PHP dans SPIP via la balise
#EVAL (#EVAL - SPIP).
Dans ton cas, cela donnerait : #EVAL{$GLOBALS['ma_variable']}.
Cordialement,
Cédric JOUANNIN
*De :*Jean Marie Grall [mailto:jeanmarie.listes@cousumain.info]
*Envoyé :* mercredi 11 juin 2014 17:07
*À :* Liste SPIP User
*Objet :* [Spip] Variables globales
Salut,
je cherche à définir des variables globales pour m'en servir à
plusieurs endroits et éviter ainsi de devoir les redéfinir
dans plusieurs squelettes.
J'ai donc déclaré ma variable dans mon fichier
mes_fonctions.php comme ceci :
$GLOBALS ['ma_variable'] = toto;
Pour les récupérer, je n'ai pas trouvé d'autre solution que de
créer des balises SPIP (comme indiqué ici
https://www.mail-archive.com/spip@rezo.net/msg04173.html):
function balise_MA_VARIABLE_dist($p) {
$p->code = "sinon(\$GLOBALS['ma_variable'],'.')";
$p->code = "htmlspecialchars(".$p->code.")";
$p->interdire_scripts = false;
return $p;
}
Du coup, je peux utiliser ma nouvelle balise #MA_VARIABLE
directement dans les squelettes.
Bon, ça marche, c'est même assez pratique, mais je me demande
si il n'y a pas plus simple (je ne maitrise pas vraiment tout
ce que ça implique en terme de ressources, si c'est optimisé...).
Si vous avez des retours là dessus...
Merci,
jean marie