Afficher les globals tout en boucle SPIP

Langage et développement
Frameworks

| par Teddy Payet

Lorsqu’on fait un développement PHP, on a besoin parfois de savoir ce qu’on a dans nos $GLOBALS. Il en va de même lorsqu’on est en développement avec SPIP. Voici un bout de code qui peut dépanner.

Préambule

Il existe des solutions plus poussées comme les logiciels IDE qui permettent de voir les fonctions appellées dans la page. Malheureusement, on n’a pas toujours la possibilité de coder avec ces logiciels dans l’infrastructure où nous sommes.
Dans SPIP, on peut même utiliser le plugin Test Builder pour créer... nos tests. C’est super pratique quand on a pris le coup de main.

Mais voilà... Ca, c’est dans le meilleur des mondes. Parfois, tout cela n’est pas possible ou on a juste besoin d’une information sans avoir à utiliser un couteau Suisse(c) là où un cure-dent suffirait.

Le code

Pour faire illustrer notre exemple, on va créer dans notre répertoire squelettes l’arborescence suivante :

  • squelettes/
    • prive/
      • squelettes/
        • contenu/
          • globals.html

Le fichier globals.html contiendra, soyons originaux, l’affichage de nos globals. Tout se fera par cette page.

Pour l’appeller, aller à l’adresse ecrire/?exec=globals. Comme le fichier est vide, vous devriez peut-être avoir une erreur ou au mieux une page "blanche".

Voici le code à insérer dans la page globals.html :

<div class="nettoyeur"> </div>
<BOUCLE_index(CONDITION){si #ENV{index}}>
        #SET{global,$GLOBALS[#ENV{index}]}
</BOUCLE_index>
        #SET{global,$GLOBALS}
<//B_index>

<B_form>
<div class="liste globals">
        <h2 class="h2">Index des $GLOBALS</h2>
        <form method="GET" action="#SELF" class="ajax">
        [(#SELF|parametre_url{'index',''}|parametre_url{'affichage',''}|form_hidden)]
        <select id="index_select" name="index">
        <BOUCLE_form(DATA) {source table, #EVAL{$GLOBALS}|array_keys} {par valeur}>[(#SET{nom_index,#VAL{"'"}|concat{#VALEUR,"'"}})] #SET{datatype,$GLOBALS[#GET{nom_index}]}
                <option value="#VALEUR"[ (#ENV{index}|=={#VALEUR}|oui) selected="selected"] data-type="[(#EVAL{#GET{datatype}}|gettype)]">#VALEUR</option>
        </BOUCLE_form>
        </select>
        <select id="affichage_select" name="affichage">
                <option value="var_dump"[ (#ENV{affichage}|=={#VALEUR}|oui) selected="selected"]>var_dump</option>
                <option value="cles"[ (#ENV{affichage}|=={#VALEUR}|oui) selected="selected"]>Afficher uniquement les clés</option>
        </select>
        <input type="submit" value="Valider" />
        </form>
</div>
</B_form>
[(#SET{nom_index,#VAL{"'"}|concat{#ENV{index},"'"}})] #SET{datatype,$GLOBALS[#GET{nom_index}]}

[(#ENV{index}|non)
<h3>$GLOBALS
[ <br/><small>(#EVAL{$GLOBALS}|gettype)</small>]
</h3>
]
[(#ENV{index}|oui)
[<h3>(#GET{datatype})
[ <br/><small>(#EVAL{#GET{datatype}}|gettype)</small>]
</h3>]
]

[(#ENV{affichage}|=={var_dump}|oui)
[<pre>(#EVAL{#GET{global}}|print|sinon{'vide'})</pre>]
]
[(#ENV{affichage}|=={cles}|oui)
[<pre>(#EVAL{#GET{global}}|array_keys|foreach|sinon{'vide'})</pre>]
]
[(#ENV{affichage}|non)
[<pre>(#EVAL{#GET{global}}|array_keys|foreach|sinon{'vide'})</pre>]
]

<script type="text/javascript">
(function($) {
        $('#index_select').change(function(){
        var datatype = $(this).find('option:selected').attr('data-type');
                if (datatype == 'array') {
                        $('#affichage_select').val('cles');
                } else {
                        $('#affichage_select').val('var_dump');
                }
        });
})(jQuery);
</script>

Explications

La boucle "index"
Elle va tout simplement regarder si on a passé un paramètre index dans notre URL. Si oui, on affichera le contenu de $GLOBALS[#ENV{index}]. Sinon, on prend $GLOBALS.

La boucle "form"
Elle va créer un formulaire avec 2 champs select. Le premier select listera tous les "index" de notre super variable PHP $GLOBALS.
Le deuxième select se charge d’indiquer quel type d’affichage désire-t-on avoir pour notre variable :
- var_dump : pour les utilisateurs PHP, cela parle de source : "affiche les informations structurées d’une variable, y compris son type et sa valeur." Sauf que dans notre cas, on n’a pas le type :-P
- cles : affiche le tableau associatif des clés de notre variable.

Les ENV
Les #ENV après notre boucle "form" vérifie la présence du paramètre "affichage" dans notre url. Selon sa valeur, on affichera d’une certaine façon le contenu de notre variable.

Le javascript
Le javascript en fin de page va juste changer la sélection du deuxième select selon le type de variable qu’on aura. Si notre variable est de type array, le select affichage sera "cles". Tous les autres types (Object, string, etc.) auront un affichage "var_dump".

Fini...

Ce code vous permet donc depuis l’espace privé d’avoir les globals. Mais il vous suffit de faire une page accessible sur la partie publique de votre site avec exactement le même code pour avoir les globals dans cet environnement.

Encore une fois, ce n’est qu’une astuce parmis d’autres. Si vous en avez aussi, elles sont les bienvenues en commentaires !
Cela permettra d’avoir d’autres pratiques de développeurs SPIP/PHP.