Déclarer une variable PHP et l'utiliser dans des squelettes lors d'inclusion SPIP

Bonjour,

pour un site que je commence à développer (SPIP 2.0.7) j’ai divisé ma page en plusieurs squelettes pour une maintenance plus aisée.

Par contre j’essaye d’utiliser une variable PHP que je déclare dans le squelette header.html dans le squelette menu.html, les deux étant appelés par des inclure dans rubrique.html, et bien ça ne marche pas.
On dirait que la portée de cette variable reste dans le squelette où elle est déclarée et qu’il n’est pas possible de l’utiliser dans un autre squelette.

1/ est ce normal ? J’ai déjà réussi mais dans une version de SPIP < 2
2/ comment faire sinon (sans répliquer les boucles dans le header… sinon je perds l’intérêt de la mutualisation).

Merci de votre aide,

a++

Alex

Bonjour,

En général, on évite de mélanger le php aux squelettes spip, sauf cas extrêmes. Il existe nativement sous spip des systèmes pour gérer des variables : #GET et #SET qui te permettent au sein d'un squelette donné de gérer tes variables. Si tu veux propager ces variables, il te faudra les passer explicitement au squelette inclus lors de l'inclure.

http://www.spip.net/fr_article1902.html
http://www.spip.net/fr_article1828.html

Merci Vincent de ta réponse, je sais que c’est MAL :slight_smile: mais là l’idée est d’utiliser un résultat des boucles déclarées dans le squelette header.html dans le squelette menu.html.

Et je ne peux pas ajouter la variable lors de l’inclusion puisque c’est un troisième fichier qui fait l’inclusion des deux…

Ca marchait bien avant pourtant :frowning:

Alex

Le 6 novembre 2009 15:27, Vincent <vincent@logaweb.fr> a écrit :

Bonjour,

En général, on évite de mélanger le php aux squelettes spip, sauf cas extrêmes. Il existe nativement sous spip des systèmes pour gérer des variables : #GET et #SET qui te permettent au sein d’un squelette donné de gérer tes variables. Si tu veux propager ces variables, il te faudra les passer explicitement au squelette inclus lors de l’inclure.

http://www.spip.net/fr_article1902.html
http://www.spip.net/fr_article1828.html

Depuis SPIP 2 le passage de variables PHP « en dur » ne fonctionne plus. Il faut passer par la variable d’environnement -

Dans ton inclure
<INCLURE{fond=header}{type_page=sommaire}>

Tu récupère ta variable dans header.html

<?php $type_page=#ENV{type_page}; ?>

Tonton BP

Alexis Poncet a écrit :

Bon donc problème insoluble en l’état j’ai l’impression cette architecture

rubrique.html :
<INCLURE{fond=header}>
<INCLURE{fond=menu}>
code squelette

header.html :

<?php $toto = 12; ?>

menu.html :
echo $toto;

Bon faut que je trouve autre chose.

Bonne soirée et bon week end,

Alex

Le 6 novembre 2009 15:58, Bernard-Paul Eminet <bernard.eminet73@orange.fr> a écrit :

Depuis SPIP 2 le passage de variables PHP « en dur » ne fonctionne plus. Il faut passer par la variable d’environnement -

Dans ton inclure
<INCLURE{fond=header}{type_page=sommaire}>

Tu récupère ta variable dans header.html

<?php $type_page=#ENV{type_page}; ?>

Tonton BP

Alexis Poncet a écrit :

Bonjour,

pour un site que je commence à développer (SPIP 2.0.7) j’ai divisé ma page en plusieurs squelettes pour une maintenance plus aisée.

Par contre j’essaye d’utiliser une variable PHP que je déclare dans le squelette header.html dans le squelette menu.html, les deux étant appelés par des inclure dans rubrique.html, et bien ça ne marche pas.
On dirait que la portée de cette variable reste dans le squelette où elle est déclarée et qu’il n’est pas possible de l’utiliser dans un autre squelette.

1/ est ce normal ? J’ai déjà réussi mais dans une version de SPIP < 2
2/ comment faire sinon (sans répliquer les boucles dans le header… sinon je perds l’intérêt de la mutualisation).

Merci de votre aide,

a++

Alex


---

_______________________________________________
liste spip
[spip@rezo.net](mailto:spip@rezo.net) - désabonnement : envoyer un mail à  [spip-off@rezo.net](mailto:spip-off@rezo.net)

Infos et archives : [http://listes.rezo.net/mailman/listinfo/spip](http://listes.rezo.net/mailman/listinfo/spip)
[http://archives.rezo.net/spip.mbox/](http://archives.rezo.net/spip.mbox/)

Documentation de SPIP : [http://www.spip.net/](http://www.spip.net/)

Irc : de l'aide à toute heure : [http://spip.net/irc](http://spip.net/irc)

Alexis Poncet a écrit :

rubrique.html :
<INCLURE{fond=header}>
<INCLURE{fond=menu}>

header.html :
<?php
$toto = 12;
?>

menu.html :
echo $toto;

header.html :
<?php
$GLOBALS['toto'] = 12;
?>

menu.html :
echo $GLOBALS['toto'];

mais tu vas au-devant de quelques soucis (problèmes
de recalcul de cache entr'autres) et puis bon... bof bof quoi !

il y a *forcément* moyen de faire différemment (et plus propre)
avec du code 'pur spip' :

rubrique.html :
   #SET{toto}, #INCLURE{fond=header, referant=rub, id_rubrique}}
   <INCLURE{fond=menu, toto=#GET{toto}}>

header.html :
   <BOUCLE_x(TABLE){critères...}>
     #SET{toto, #CHAMP}
   </BOUCLE_x>
   [(#ENV{referant}|=={rub}|oui)#GET{toto}]

menu.html :
   #ENV{toto}

Merci Denis pour ton aide mais le code PHP ne fonctionne pas et je n’arrive pas à comprendre le code SPIP que tu me donnes…
Je vais chercher mais c’est pas assez limpide pour moi…

Alex

Le 6 novembre 2009 17:36, denisb <denisb@laposte.net> a écrit :

Alexis Poncet a écrit :

rubrique.html :
<INCLURE{fond=header}>
<INCLURE{fond=menu}>

header.html :

<?php $toto = 12; ?>

menu.html :
echo $toto;

header.html :

<?php $GLOBALS['toto'] = 12; ?>

menu.html :
echo $GLOBALS[‹ toto ›];

mais tu vas au-devant de quelques soucis (problèmes
de recalcul de cache entr’autres) et puis bon… bof bof quoi !

il y a forcément moyen de faire différemment (et plus propre)
avec du code ‹ pur spip › :

rubrique.html :
#SET{toto}, #INCLURE{fond=header, referant=rub, id_rubrique}}
<INCLURE{fond=menu, toto=#GET{toto}}>

header.html :
<BOUCLE_x(TABLE){critères…}>
#SET{toto, #CHAMP}
</BOUCLE_x>
[(#ENV{referant}|=={rub}|oui)#GET{toto}]

menu.html :
#ENV{toto}


liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
http://archives.rezo.net/spip.mbox/

Documentation de SPIP : http://www.spip.net/

Irc : de l’aide à toute heure : http://spip.net/irc

Alexis Poncet a écrit :

Je vais chercher mais c'est pas assez limpide pour moi...

rubrique.html :
#SET{toto}, #INCLURE{fond=header, referant=rub, id_rubrique}}
<INCLURE{fond=menu, toto=#GET{toto}}>

déjà, là, j'ai fait une faute. c'est :
   #SET{toto, #INCLURE{fond=header, referant=rub, id_rubrique}}
   <INCLURE{fond=menu, toto=#GET{toto}}>

depuis mon squelette rubrique.html, j'inclus header.html
en lui passant en paramètre l'id de la rubrique (ça pourrait servir)
et une variable 'referant' de valeur 'rub' pour lui indiquer
(à header.html) d'où il est appelé (l'origine de l'INCLURE).

ensuite j'inclus menu.html à qui je passe en paramètre
une variable 'toto' dont la valeur est ce que m'a retourné
header.html (voir ce qui suit)

header.html :
<BOUCLE_x(TABLE){critères...}>
   #SET{toto, #CHAMP}
</BOUCLE_x>

dans mon squelette header.html, je fais ma petite tambouille
avec mes boucles etc.
ici, la boucle _x renseigne une variable 'toto' avec comme valeur
celle du champ #CHAMP.
bien sûr, dans cet exemple, la variable 'toto' voit sa valeur
modifiée à chaque 'tour de boucle'. donc seule la valeur du
dernier enregistrement retourné par la boucle sera affectée
à 'toto'.

si on voulait récupérer tous les enregistrements retournés il
faudrait utiliser un tableau. de la forme :
   #SET{toto, #ARRAY{}}
   <BOUCLE_x(TABLE){critères...}>
     [(#SET{toto, #GET{toto}|push{#CHAMP}})]
   </BOUCLE_x>

à noter que cette boucle ne produit aucun affichage (aucune sortie html)

[(#ENV{referant}|=={rub}|oui)#GET{toto}]

ici, toujours dans header.html donc, je teste d'où
vient l'appel.
si header.html a été appelé depuis la page rubrique.html,
ce que je sais grâce au paramètre passé à l'INCLURE (voir
plus haut), alors je retourne ma variable 'toto' précédemment
renseignée.
s'il s'agit d'un tableau ce sera :
   [(#ENV{referant}|=={rub}|oui)[(#GET{toto}|serialize)]]

menu.html :
#ENV{toto}

le deuxième INCLURE depuis rubrique.html, appelé après
celui de header.html donc, profite du retour de ce dernier (qui
arrive dans rubrique.html grâce à #GET{toto} et lui est passé
par toto=#GET{toto}).
je récupère donc 'toto' (sa valeur) dans menu.html
si toto est un tableau à l'origine (voir header.html), je peux
l'utiliser avec :
   [(#ENV**{toto}|unserialize)]

l'exemple complet :

créer 3 fichiers xrubrique.html, xheader.html et xmenu.html
et les placer dans squelettes/
à tester en appelant : ?page=xrubrique

-----xrubrique.html----------
#CACHE{0}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-language" content="fr">
<title>- -test- -</title>
</head>
<body>
#SET{toto, #INCLURE{fond=xheader, referant=rub}}
<INCLURE{fond=xmenu, toto=#GET{toto}}>
[(#REM) ce deuxième inclure de xheader ne retournera rien car ici
         xheader ne reçoit pas referant=rub ]
<INCLURE{fond=xheader}>
</body>
</html>

-----xheader.html----------
#CACHE{0}
#SET{toto, #ARRAY{}}
<BOUCLE_x(ARTICLES){id_article==^(1|3)}>
[(#SET{toto, #GET{toto}|push{#ID_ARTICLE}})]
</BOUCLE_x>
[(#ENV{referant}|=={rub}|oui)[(#GET{toto}|serialize)]]

-----xmenu.html----------
#CACHE{0}
<BOUCLE_z(ARTICLES) {id_article IN #ENV**{toto}|unserialize} {"<br />"}>
#TITRE
</BOUCLE_z>

je suis pas persuadé d'avoir été trés clair...