SPIP - Contrib

SPIP - Contrib

[ar] [en] [es] [fr] [it]

76 visiteurs en ce moment

fontsizeup fontsizedown
[34 commentaires]

La balise #ENV

Fonctionnement et usage divers et variés

mardi 25 septembre 2007, par Maïeul

2 votes

Régulièrement, on lit sur la liste ou sur IRC « la balise #ENV, j’y comprends rien » ... tentons ici une explication sur le pourquoi du comment de cette balise ....

#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 :

VariableValeur
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 :

VariableValeur
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 :

VariableValeur
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.

Notes

[1] ben oui quoi, c’est un tuto sur #ENV

[2] il semble que ce soit la même chose avec #INCLURE, mais j’avoue ne pas avoir saisi la nuance

[3] sauf si on force leurs valeurs lors d’un ou #INCLURE

[4] par exemple, dans une boucle (ARTICLES), chaque article à un identifiant id_article

Retour en haut de la page

34 Messages de forum

Voir toute la discussion

Pages 1 | 2 | 3 | 4

  • Répondre à ce message

    13 mai 07:45 , par MR

    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/tick...

    Ce bug est corrigé dans la v2.0.8

  • Répondre à ce message

    6 mai 20:05 , par wal

    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...

  • Répondre à ce message

    6 mai 18:09 , par Maïeul

    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...

  • Répondre à ce message

    6 mai 16:07 , par wal

    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 !

  • Répondre à ce message

    18 janvier 18:56

    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

    17 janvier 18:07 , par Régis

    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.

  • Répondre à ce message

    11 janvier 19:34 , par piercol

    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

    11 janvier 19:13 , par Maïeul

    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

    11 janvier 19:01 , par piercol

    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 [ ]

  • Répondre à ce message

    11 janvier 18:52 , par Maïeul

    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)

Pages 1 | 2 | 3 | 4

Répondre à cet article

Retour en haut de la page

Ça discute par ici