SPIP - Contrib

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



Accueil du site > Outils pour squelettes > Tutoriaux pour squelettes

La balise #ENV

Fonctionnement et usage divers et variés

mardi 25 septembre 2007, par Maïeul. Dernier ajout dimanche 2 mars 2008


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


Répondre à cet article

  • La balise #ENV

    25 juillet 2008 12:08, par Corinne

    Bonjour, Ma problématique est la suivante, j’aimerai afficher différemment les articles anciens ie plus vieux que juin 2008, je pense que la balise #ENV peut me permettre de récupérer la variante date, mais ensuite, quid ? Si quelqu’un peut m’aider ... merci d’avance

    Répondre à ce message

    Retour au début des forums

  • Tutoriel sur debug

    8 mai 2008 08:23, par b.poiraud

    Bonjour

    Je cherche un tuto de base sur l’utilisation de DEBUG

    je viens en effet de trouver ceci :

    http://echange.ovh.org/?var_mode=debug

    et je ne sais pas du tout ce que cela peut vouloir dire.

    Auriez-vous une indication à me donner ?

    Merci

    B.Poiraud

    Répondre à ce message

    Retour au début des forums

  • La balise #ENV

    27 février 2008 16:38, par Loiseau2nuit

    Maïeul, si je puis me permettre, "Je T’Aime !!!" :-D :-D :-D

    Répondre à ce message

    • La balise #ENV 27 février 2008 17:14, par Loiseau2nuit

      En fait, peut être pas encore tout à fait :-P

      Le contexte : sur un site, j’ai 5 rubriques actives dont 2 qui sont des rubriques listant des produits. la première des 2 liste des produits pour les humains (id n°2), la seconde des produits pour les animaux (id n°5).

      après avoir lu ceci :

      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

      je me suis testé sur le code suivant sur le squelette d’un même inc, qui est appelé par les 2 rubriques produit au niveau du menu de navigation par rubrique :

      <BOUCLE_quelle_rubrique_produit(RUBRIQUES) {id_rubrique=2}>
      #EXPOSE{"
                      <ul>
                              <BOUCLE_gammes(MOTS) {type=Gamme} {tout}>
                                      <li><a href="#URL_MOT"[ class="(#EXPOSE)"]>#TITRE</a></li>
                              </BOUCLE_gammes>
                      </ul>
                      ",
                      "
                      <ul>
                              <BOUCLE_gammes_animales(MOTS) {type=Gamme_animale} {tout}>
                                      <li><a href="#URL_MOT"[ class="(#EXPOSE)"]>#TITRE</a></li>
                              </BOUCLE_gammes_animales>
                      </ul>       
                      "
              }
      </BOUCLE_quelle_rubrique_produit>

      là dessus dans ma page rubrique, j’appelle donc mon inc comme ceci :

      <a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE)]</a>
              <!-- Affichage des autres gammes de produits de la rubrique en cours et uniquement celle-ci-->
                      [(#EXPOSE|=={on}|?{' ',''})
                      <INCLURE{fond=skel_catalogue/inc/list-gammes}{id_rubrique}{id_article}>
                      ]

      M’attendant tout naïvement à recevoir à l’affichage final un truc du style :

      et ce que j’obtiens au final est quelque peu différents, à savoir :

      J’en conclus donc que lorsque l’on veut soit un tronçon de code, soit l’autre, à la différence d’une simple phrase, là il faut adapter la syntaxe d’#EXPOSE d’une manière que je ne visualise pas. Ou alors je ùme suis tout bonnement planté sévère dans mes critère/ma boucle ???

      Alors ? Dois-je demander le divorce maintenant ou est-ce que j’attends un peu ? :-P

      Quoi qu’il en soit, merci à toi qui m’a lu, compris, et qui saura me donner une piste ;)

      Répondre à ce message

      • La balise #ENV 28 février 2008 10:19, par Maïeul

        hum j’ai pas très bien compris ...

        d’abord quel sont les paramètres #ENV que te donne le debuguer pour ton fichier inclut ?

        ensuite quel est le code de ce fichier inclut.

        Et puis je crois me souvenir (but not sur) que l’on peut pas mettre de <INCLURE> entre les parentheèse et les crochets. Mais on peut mettre un #INCLURE

        Répondre à ce message

        • La balise #ENV 28 février 2008 10:41, par Loiseau2nuit

          monsite.tld/spip.php?rubrique2&var_mode=debug

          squelettes/skel_catalogue/inc/list-gammes.html : squelette résultat code

          #ENV

          fond : skel_catalogue/inc/list-gammes
          id_rubrique : 2
          id_article :
          lang : fr

          1 boucle résultat code        <BOUCLE_quelle_rubrique_produit(RUBRIQUES) {id_rubrique=2}>
          2 boucle résultat code        <BOUCLE_gammes(MOTS) {type=Gamme} {tout}>
          3 boucle résultat code        <BOUCLE_gammes_animales(MOTS) {type=Gamme_animale} {tout}>

          Donc à prioris, l’inc a bien compris où elle se situait. Ce qui est déjà un début, seulement je ne comprend pas pourquoi la boucle n°3 s’execute alors qu’à priori, mon code lui demande spécifiquement de NE PAS s’executer si on se trouve en rubrique 2.

          Or, comme l’inc n’est appelée que par la rubrique 2 et la rubrique 5...

          Quand au code de mon inc, le fichier list-gammes.html, c’est le premier tronçon de code que j’ai envoyé, à savoir celui-ci :

          <BOUCLE_quelle_rubrique_produit(RUBRIQUES) {id_rubrique=2}>
          #EXPOSE{"
                          <ul>
                                  <BOUCLE_gammes(MOTS) {type=Gamme} {tout}>
                                          <li><a href="#URL_MOT"[ class="(#EXPOSE)"]>#TITRE</a></li>
                                  </BOUCLE_gammes>
                          </ul>
                          ",
                          "
                          <ul>
                                  <BOUCLE_gammes_animales(MOTS) {type=Gamme_animale} {tout}>
                                          <li><a href="#URL_MOT"[ class="(#EXPOSE)"]>#TITRE</a></li>
                                  </BOUCLE_gammes_animales>
                          </ul>       
                          "
                  }
          </BOUCLE_quelle_rubrique_produit>

          quand à l’INCLURE entre parenthèse et crochets, à prioris, c’est dans mon squelette rubrique que cela intervient et ca fonctionnait plutôt bien avant que je ne cherche à rajouter une liste de gammes spécifique à la rubrique animale (la n°5 donc.)

          Ceci dit, je veux bien tester en remplacant mon <INCLURE...> par un #INCLURE mais je ne maitrise pas cette syntaxe, je ne savais d’ailleurs pas qu’elle existait, ne m’étant jamais trop penché sur les mécanismes de la création de mes propres balises.

          Alors c’est grave Docteur ???

          Merci encore en tout cas.

          Répondre à ce message

          • La balise #ENV 2 mars 2008 10:34, par Maïeul

            la raison est assez simple : on ne peut pas mettre entre des boucles mais seulement des combinaison de balise ;-)

            faut se débrouiller autrement (avec une boucle test)

            Répondre à ce message

            • La balise #ENV 2 mars 2008 10:55, par Loiseau2nuit

              Seulement des combinaisons de balises ?

              donc si je me résume, en mettant mes 2 listes à puce de Mot-clés dans des inclure je devrais ensuite pouvoir faire un truc du style :

              #EXPOSE{"
                             <INCLURE{fond=list-gammes}>
                             ",
                             "
                             <INCLURE{fond=list-gammes-animales}>      
                             "
                     }

              Pour toi ca pourrait marcher ???

              (Dsl j’aurais bien testé de suite, mais je ne suis pas sur ma machine-serveur...)

              J’ai encore un peu de mal avec les boucles test et/ou conditionnelles. Je crois que j’ai encore du pain sur la planche.

              En tout cas merci encore ;)

              Répondre à ce message

    Retour au début des forums

  • La balise #ENV

    27 février 2008 21:28, par neis

    Un Grand merci !

    Répondre à ce message

    Retour au début des forums

  • La balise #ENV Qu’es aquò ?

    7 février 2008 11:26, par Pèire Brechet

    Le professeur d’occitan de service vous fait remarquer que QU’ES AQUÒ ? s’écrit ainsi.

    La mentalité française s’estimant destinée à "l’universalité" faisait peu de cas des Langues de France regardées comme des "patois". On notait les mots empruntés dans une phonétique grossière : quézaco quesaco etc balèze, que dalle… (balès, que d’ala) J’ose croire que vous avez péché par ignorance et sans reprendre à votre compte un quelconque mépris des méridionaux. Vous les honorerez de les respecter.

    Répondre à ce message

    • La balise #ENV Qu’es aquò ? 7 février 2008 12:11, par Maïeul

      soit, c’est corrigé

      Répondre à ce message

    • La balise #ENV Qu’es aquò ? 24 février 2008 10:30, par pioz

      Le commun des mortels ne peux que se féliciter des apports du patois et honorer ses pères, qui se foutent bien de ce que l’on peux écrire et donc lire comme conneries à propos de leur soit disant héritage alors qu’ils ne savaient, pour la plupart, ni lire ni écrire :)

      Un Marchois (entre France et Occitanie du coup ni l’un ni l’autre ?)

      ps : pardon pour le dérangement mais bon... cela fait du bien tout de même :o)

      Répondre à ce message

    Retour au début des forums

  • La balise #ENV

    19 novembre 2007 22:06

    bonjour,

    saurais tu pourquoi lorsqu’un rédacteur tape <message|texte=C'est pour nous, une façon de vivre>

    et que le modéle contient  [(#ENV*{texte}|propre)]

    cela donne    <p class="spip">C’est pour nous, une façon de vivre</p>

    impossible d’enlever le p class=spip..

    merci d’avance

    Répondre à ce message

    • La balise #ENV 23 novembre 2007 10:40, par pommé

      Je complète ma question : si dans un modèle je récupère, avec la balise #ENV, la variable texte comment :

      1- récupérer les adresses mails, liens saisis par le rédacteur (en 1.9.2c j’obtiens @@SPIP_ECHAPPE_LIEN_1@@ à la place du mail)

      2- les documents /images inclus dans le texte.. je n’obtiens rien

      J’ai essayée des combinaisons de  #ENV, #ENV*, #ENV**, typo, propre   mais je n’y arrive pas.

      Ps : je sais récupérer un seul lien ou une seule image passée explicitement dans le modéle avec <modelexx|doc=10|mail=xxx|texte=blabla> mais pas ceux placés dans le texte.

      Merci pour vos éclaircissements

      Répondre à ce message

    • La balise #ENV 7 février 2008 12:15, par Maïeul

      La classe spip se resout avec le plugin couteaux suisse et la dernière version de spip

      Répondre à ce message

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net