#ENV, qu’est-ce à dire ?
Si nous lisons la documentation officielle, nous voyons que
[(#ENVxxxx,zzzz)] (depuis SPIP 1.8, SPIP 1.8.1) permet d’accéder à la variable de nom xxxx passée par la requête HTTP. zzzz est une partie optionnelle qui permet de retourner une valeur même si la variable xxxx n’existe pas.
Ah... mais en fait, c’est plus subtil que cela. En réalité, #ENV permet d’accéder aux variables dites d’environnement d’un squelette.
Qu’es aquò variable d’environnement ?
Un squelette SPIP est appelé dans un certain contexte. Par exemple, si vous appelez http://www.spip.net/spip.php?article1 ou bien http://www.spip.net/spip.php?article2, SPIP utilisera le même squelette , article.html, mais ne lui fournira pas les mêmes variables d’environnement.
Mais quelles variables d’environnement sont passées aux squelettes ?
C’est vrai ça, on sait que le squelette reçoit des variables d’environnement, mais lesquelles ?
En préambule, je vais vous donner un « truc » pour savoir quelles variables d’environnement sont passées à votre squelette.
Il s’agit d’un mode « debug » de SPIP. À la fin de l’adresse d’une page publique, rajoutez &var_mode=debug... Et là ? Surprise ! vous arrivez sur la page de débogage de squelette.
Sur cette page est listé chaque squelette appelé par la page, avec différents détails...
Ce qui nous intéresse plus particulièrement, c’est la partie #ENV [1]
Prenons l’exemple du squelette de la dist, appelons la page http://site.tld/spip.php?article2&var_mode=debug, nous obtenons ceci
Et voilà la liste des variables d’environnement, avec leurs valeurs... Ainsi, dans cet exemple, si nous écrivons #ENV{id_article} dans le squelette article.html ; nous obtiendrons 2
Bon, d’accord... maintenant, on connaît ce truc, mais bon ... ce serait mieux si on savait d’avance quelles sont ces fameuses variables.
Cas 1 : le squelette de la page
Sans doute le cas le plus simple. Le squelette qui est appelé « directement » quand on accède à une page reçoit comme variables #ENV l’ensemble des variables fournies par l’URL.
Exemple : http://www.site.tld/?page=xxx&var1=val1&
Passera au squelette xxx, les variables d’environnements suivantes :
| Variable | Valeur |
|---|---|
| page | xxx |
| var1 | val1 |
Cas 2 : les squelettes inclus
Bon, bon... vous incluez un squelette dans votre squelette...
Si vous faites <INCLURE{fond=yy}{var2=val2}> [2], le squelette yy reçoit les variables d’environnement suivantes :
| Variable | Valeur |
|---|---|
| fond | yy |
| var2 | val2 |
Signalons, au passage que SPIP transmet par défaut, le contexte de langue au squelette inclus.
Ainsi, si vous incluez votre squelette dans un contexte de langue française, le squelette inclus recevra comme variable #ENV« lang » la valeur « fr ». Cependant, il y a possibilité de forcer la variable lang ainsi passée. Il suffit de faire, par exemple<INCLURE{fond=yy}{var2=val2}{lang=en}>.
Signalons aussi le cas des paramètres sans arguments... du genre <INCLURE{fond=yy}{id_article}. Eh bien, dans ce cas, le squelette inclus recevra la variable #ENV « id_article » dont la valeur sera celle de l’id_article courant.
Enfin, signalons la possibilité de passer à un squelette inclus l’ensemble des variables d’environnement du squelette incluant ! Il suffit pour cela d’ajouter le critère {env} dans l’appel de votre INCLURE... Cependant, il est conseillé d’éviter cela : en effet, rappelons qu’un fichier de cache est généré pour chaque combinaison de variable #ENV.
Cas 3 : les modèles
Depuis SPIP 1.9.1, il est possible d’installer des modèles dans un article.
Pour rappel, la syntaxe générale de l’appel d’un modèle est <modelexxx|align|var1=val1|...|varn=valn>
Un modèle, n’est après tout qu’un squelette. Comme tout squelette, il reçoit des paramètres #ENV.
Prenons un exemple simple <modele1|left|variable=valeur>.
Les variables passées sont :
| Variable | Valeur |
|---|---|
| id | 1 |
| id_modele | 1 |
| align | left |
| variable | valeur |
| lang | Langue du contexte |
Cas 4 : les formulaires
Rappelons qu’un formulaire est composé de deux fichiers :
- un squelette
- un fichier php, chargé de la prise en charge des données.
C’est le fichier php, qui en appelant le squelette, va lui transmettre un certain nombres de variables #ENV. Il faut donc regarder pour chaque formulaire ce qu’il en est (via le mode debug).
Cas 5 : les pages en « article »,« rubrique » etc
Les pages qui fonctionnent en URL propres fournissent leurs variables #ENV selon des règles spéciales.
Si une page fonctionnant en URL propres est une page de type « article », le squelette recevra comme variable d’environnement id_article de la valeur du numéro de l’article concerné...
Il en est de même pour les pages de types rubriques, mot, etc.
Des variables d’environnement de date
Des variables d’environnement calculées automatiquement [3] sont passées à tout les squelettes calculés sauf les modèles
Ces variables sont date et date_redac, qui ont pour valeur la date de calcul de la page... Elles servent au calcul des critères {age} et {age_redac}
Quelles utilisations ?
De nombreuses utilisations sont possibles, notamment à l’aide des filtres de comparaisons. Cela pourrait être l’objet d’une documentation à part.
La balise #EXPOSE
Citons cependant le plus souvent demandé : l’utilisation de la balise #EXPOSE.
Dans une boucle (OBJETS), où chaque objet à un identifiant unique de la forme id_objet [4], lorsque cet identifiant est égal à la valeur de la variable d’environnement id_objet, la balise #EXPOSE retourne son premier argument ; sinon, son second argument.
Exemple : Soit la page www.domaine.tld/spip.php?page=toto&id_article=2
Supposons que notre site n’ait que deux articles, les numéros 1 et 2.
Si le squelette toto.html contient la boucle suivante
<BOUCLE_toto(ARTICLES)>
l'article n°#ID_ARTICLE #EXPOSE{"est l'article courant", "n'est pas l'article courant"}
</BOUCLE_toto>Alors le résultat sera
l’article n°1 n’est pas l’article courant
l’article n°2 est l’article courant
/ !\ La syntaxe SPIP prohibe totalement de mettre des boucles entres
{}. Seule des balises et filtres peuvent exister.
Conclusion : encore pas mal de rédaction
Voilà ! Il y a encore pas mal de choses à écrire pour saisir toutes les subtilités des variables d’environnement, mais j’espère que cet article, laborieusement écrit à la sueur des mes doigts vous aura permis de comprendre un peu mieux comment les déterminer.




Vos commentaires
# Le 22 juillet 2011 à 00:52, par severo
En réponse à : La balise #ENV
Peut être peut-on ajouter que :
#ENV{variable}et
#VARIABLEdonnent le même résultat (me corriger si je dis n’importe quoi, mais il me semble que c’est vrai) ! Evidemment avec des fonctionnalités en moins (valeur par défaut, et les astérisques)
Répondre à ce message
# Le 20 janvier 2010 à 12:54, par filnug
En réponse à : La balise #ENV
décidément Maïeul, votre doc est tjs intéressante !!!
si j’ai une url ?rubrique1&mots[1]=1&couleurs[1]=4 , comment je fais pour récupérer les id de « mots » ET "couleurs ? du genre :
<BOUCLE_mot_art(MOTS){id_mot==(#ENV{mots&couleurs}>???Le but de cette recherche/question est en rapport à ma question pour le plugin « critère mots ». Mon but est d’éviter que mon lien url
<a href="[(#SELF|parametre_url{mots[#COMPTEUR_BOUCLE],#ID_MOT})]">n’ajoute tout le temps des nouveaux argument dans l’url, mais se contente de 2 maximum. D’où mon idée, d’une fois &mots=#ID_MOT et &couleurs=#ID_MOT# Le 22 janvier 2010 à 16:44, par Maïeul
En réponse à : La balise #ENV
comme l’a dit denisb dans son poste, il faut que tu fasse un |array_merge des #ENV (
#ENV{mots[1]et#ENV{couleur[1]}. Par exemple# Le 22 janvier 2010 à 17:12, par filnug
En réponse à : La balise #ENV
Merci beaucoup pour tes réponses !!!
Répondre à ce message
# Le 23 avril 2010 à 00:06, par Frédéric
En réponse à : La balise #ENV
Bonjour,
J’aimerais que l’aspect des formulaires de forum change en fonction de l’article auquel se rapporte le forum. J’imagine que c’est possible en récupérant l’ID_ARTICLE dans la page forum.html mais je n’arrive pas à le récupérer... quelqu’un pourrait-il m’aider ?
Merci !
# Le 23 avril 2010 à 18:13, par Maïeul
En réponse à : La balise #ENV
Cela n’a pas trait directement au sujet de cet article. Cependant je pense (sans connaitre très bien les squelette par défaut de spip) que
#ENV{id_article}devrait faire l’affaire.Répondre à ce message
# Le 21 mai 2010 à 09:52, par Maxime Charruel
En réponse à : La balise #ENV
Bonjour !
Dans le but de finaliser mon plugin, j’ai besoin de faire passer mes variables d’environnement via un lien javascript. Je m’explique, j’ai ceci :
Je voudrais passer #ENV à mapage, quelquechose du genre :
Mais c’est pas ça :P
Merci !
# Le 21 mai 2010 à 10:31, par Maïeul
En réponse à : La balise #ENV
rien compris à ce que vous dite !
pourquoi mettez vous du php ? normalement il n’y a pas besoin de php dans un squelette spip.
Pouvez vous donner un exemple de type de liens que vous voudriez voir généré.
# Le 21 mai 2010 à 10:45, par Maxime Charruel
En réponse à : La balise #ENV
En fait, j’ai oublié de préciser que cette ligne de code se trouve dans monplugin.fonctions.php.
Ma fonction est insert_head, elle doit insérer dans mon head un .js, d’où le :
L’intégration du .js fonctionne parfaitement, seulement, dans mon .js, j’utilise les balises
#ENV{type}et#ENV{page}. J’aurai donc besoin de faire passer mes variables d’environnement. Je suis peut-être sur une mauvaise piste, il y a peut-être une autre solution.En gros, j’aimerai que mon lien envoie ceci :
Mais ça ne fonctionne pas !
Merci !
# Le 21 mai 2010 à 14:11, par Maxime Charruel
En réponse à : La balise #ENV
J’ai ciblé le problème, en fait, vu que mon fichier .js est dans le header, quand je fais
#ENV{page}je me retrouve avec le nom du fichier .js (dont je m’en fous complètement :P).Je souhaite récupérer le nom de la page (rubrique/article/auteur), seulement voilà, dans l’ordre d’appel, j’ai mon header / mon css / ma page :(
Je vais voir si, avec un lien, je peux pas récupérer les variables d’environnement !
# Le 22 mai 2010 à 11:02, par Maïeul
En réponse à : La balise #ENV
malheureusement dans le php on ne peut pas utiliser les balises de spip.
En revanche je pense que les variables d’environnement se trouve dans le tableau des $GLOBALS
ceci dit, pourquoi passer par un insert_head si ce n’est pas pour faire un plugin ? autant mettre directement dans le head à partir du du squelette ...
Répondre à ce message
# Le 6 mars 2010 à 14:47, par ?
En réponse à : La balise #ENV
Bonjour,
Article très intéressant mais il reste encore des zones d’ombres pour moi.
Par exemple :
J’ai une url du type ?rubr=1,2,3 (encodée avec urlencode de php)
dans le fichier qui reçoit ce paramètre si je fais
#ENV{rubr}ça affiche bien 1,2,3maintenant, si je mets dans une boucle du type
<BOUCLE_lieux(ARTICLES){id_secteur=1}{id_rubrique IN #ENV{rubr}}>Ca n’affiche que la rubrique 1 (le premier id qu’il rencontre)
J’ai essayé de faire un filtre dans mes_fonctions.php avec un urldecode mais je ne sais pas où le mettre.
#ENV|mon_filtre{rubr}renvoie un tableau sérialisé de toutes les variables d’environnement et#ENV{rubr}|mon_filtren’agit pas.D’où question : peut-on appliquer un filtre sur #ENV, si oui, comment ?
Sinon, comment faire pour récupérer ce genre d’url ?
Merci à toutes et tous
Serge
# Le 8 mars 2010 à 11:21, par Maïeul
En réponse à : La balise #ENV
Bonjour,
je suis vraiment étonné que votre test n’agisse pas. Êtes vous sûr que vos rubrique 1,2,3 soit dans le secteur 1 ?
Répondre à ce message
# Le 6 mai 2009 à 16:07, par wal
En réponse à : variable « personnalisées » dans l’URL
bonjour à tous,
j’ai une petite question : dans spip 2, peux-t’on passer une variable quelconque dans une url (genre monsite/spip.php ?rubrique60&toto=7), et récupérer ensuite cette variable avec la balise #ENVtoto ?
merci de vos réponses !
# Le 6 mai 2009 à 18:09, par Maïeul
En réponse à : variable « personnalisées » dans l’URL
oui, tout à fait ... c’était déjà le cas avant.
Attention, la variable #ENV n’est passé qu’au premier squelette appelé, pas au squelette inclu, sauf si tu explicite lors de l’appel que tu veux lui passer...
# Le 6 mai 2009 à 20:05, par wal
En réponse à : variable « personnalisées » dans l’URL
ok merci !
mais ça marche pas chez moi... si je résume, avec mon url monsite/spip.php ?rubrique60&toto=7, je passe la variable toto au squelette rubrique.html, et je récupère la valeur de toto dans ce squelette grace à la balise #ENVtoto, échec, sauf que ça me retourne systématiquement « échec » ... comprends pas... quelqu’un a deja rencontré ce problème ? j’ai passé l’après midi dessus, rien à faire...
# Le 13 mai 2009 à 07:45, par MR
En réponse à : variable « personnalisées » dans l’URL
Quelle version de spip utilises-tu ?
Parce qu’un GROS bug présent dans la v2.0.7 a pour conséquence que seul le premier paramètre de l’URL est récupé par cette balise, donc
#ENVtoto est vide alors que
<?php_ $toto = $_GET['toto'];
_ ?>
affectera bien 7 à toto !
Lire :
http://trac.rezo.net/trac/spip/ticket/1755
Ce bug est corrigé dans la v2.0.8
Répondre à ce message
# Le 4 novembre 2008 à 17:33, par Cédric
En réponse à : La balise #ENV / filtrer une boucle
Bonjour
Je me sert de la balise #ENV pour filtrer une boucle... jusque la pas de problème, tout fonctionne bien. Le problème arrive quand il n’y a pas le filtre définit dans l’url, donc pas dans #ENV, la boucle ne sort rien. Je voudrais qu’elle sorte tout.
Illustration :
J’ai des articles sur lesquels j’attribue des mots clé A, B ou C.
Je passe en url un « monsite/spip.php ?page=mapage&motcle=id_A » (id_A correspondant à l’id des mots clé).
Dans le squelette il y a une boucle ARTICLES filtré par « id_mot=#ENVmotcle ».
S’il n’y a pas d’info de mot clé en url, la boucle est vide. J’aimerais au contraire qu’elle affiche tout les articles.
Comment faire pour utiliser le même squelette quand il n’y a pas de « &motcle » passé en url ?
Avec une boucle sur les mots clé existant et une syntaxe du type &motcle[]=id_dumotcle envoyé en url (une belle url bien longue...), un filtre « id_mot IN #ENV**motcle » me renvoie tous les articles avec n’importe quel mot clé, mais pas les articles sans mot clé.
# Le 4 novembre 2008 à 22:15, par Maïeul
En réponse à : La balise #ENV / filtrer une boucle
bonjour,
pas sur d’avoir bien compris votre problème,
mais je pense qu’il faut utiliser la syntaxe alternative
#ENV{var,valeur_alternative}# Le 4 novembre 2008 à 22:25, par Cédric
En réponse à : La balise #ENV / filtrer une boucle
Quelle valeur utiliser pour la valeur alternative ?
Si je filtre ma boucle par un mot clé : BOUCLE(ARTICLES) id_mot=#ENVmotfiltre,0.
Problème si je ne passe pas de motfiltre dans l’url il cherche mon mot clé 0 et ne me sort aucun article dans la boucle.
Je cherche donc à supprimer le filtre dans le cas où il n’est pas renseigné dans l’url pour afficher tous les articles. j’aimerai ne pas créer un squelette différent où je supprime le filtre par id_mot.
# Le 17 janvier 2009 à 18:07, par Régis
En réponse à : La balise #ENV / filtrer une boucle
Un petit message simplement pour dire que je me cogne exactement à la même problématique que Cédric (voir quelques messages plus bas).
Si quelqu’un a un élément de réponse pour cette question, je suis preneur.
En attendant, j’utilise des boucles conditionnelles en php pour vérifier l’existence de mes #ENV précédemment passés en GET.
# Le 18 janvier 2009 à 18:56, par ?
En réponse à : La balise #ENV / filtrer une boucle
Et bien pour ceux qui se sont posé la même question que Cédric et moi, il y a des éléments de réponse ici : http://forum.spip.org/fr_211033.html
Répondre à ce message
# Le 11 janvier 2009 à 19:34, par piercol
En réponse à : La balise #ENV
OK, j’ai mis un moment à comprendre, mais maintenant ça fonctionne.
Je pensais - je ne sais pas pourquoi - qu’il fallait déclarer une valeur par défaut de #ENV au moment du chargement de la page, j’avais écrit
#ENV{tri}dans mes boucles.je l’ai corrigé en
#ENV{tri,date}et ça roule.
Merci pour le coup de main.
Répondre à ce message
# Le 11 janvier 2009 à 19:01, par piercol
En réponse à : La balise #ENV
Merci pour votre réponse rapide
Ce que je ne vois pas, c’est où je dois écrire cette expression dans ma page.
Dans le head ?, dans le body ? à quel endroit ?
et j’écris
#ENV{tri,date}comme cela, sans < >, ou [ ]# Le 11 janvier 2009 à 19:13, par Maïeul
En réponse à : La balise #ENV
ben j’en sais rien moi où il faut que vous le mettiez ... c’est votre code après tout ;-) d’autant que vous aviez l’air de comprendre comment se servir de la blise #ENV pour le système de tri
non, plus sérieusement, je suppose que vous avez un boucle du genre
<BOUCLE_xxx (XXX) {par #ENV{tri}}>et donc il faudrait mettre
<BOUCLE_xxx (XXX) {par #ENV{tri,valeur_alternative}}>pas besoins de crochet normalement
Répondre à ce message
# Le 11 janvier 2009 à 18:48, par piercol
En réponse à : La balise #ENV
Dans le sommaire de mon site, je propose aux visiteurs de choisir le mode de tri des liste d’articles (par date de création ascendante ou descentante, date de mise à jour, titre, popularité, nombre de visites, et hasard).
Cela fonctionne parfaitement dans la page, grâce à l’utilisation de la balise #ENV qui envoie les critères de tri à partir d’un des boutons vers une boucle où #ENV détermine le critère de tri.
Le problème que je ne parviens pas à résoudre est le suivant : comment entrer dans la page sommaire avec une adresse qui ne comporte pas l’indication du critère de tri ?
En effet si j’entre dans l’adresse spip.php&tri=date, ou tri=titre pas de problème
Mais si j’entre simplement dans spip.php, j’ai une erreur squelette, parce que la balise #ENV est vide
il manque quelque chose du genre if #ENV est vide alors #ENV=date, au moment du chargement de la page.
Quel pourrait être la syntaxe de ce petit script php ?
Voir sur le site à ces deux adresses :
- ce qui marche http://www.histoirepassion.eu/index.php?tri=date
- ce qui ne marche pas http://www.histoirepassion.eu/index.php
# Le 11 janvier 2009 à 18:52, par Maïeul
En réponse à : La balise #ENV
il faut utiliser la syntaxe alternative
#ENV{tri,valeur_si_vide}par exemple si vous voulez que par défaut cela soit triè par date
#ENV{tri,date}(remarquez que c’est dit dans l’article)
Répondre à ce message