Alors si je comprends bien, on ne peut pas mettre de boucle
dans un fichier php3
qui est appelé par un include dans une autre page.
en effet non, et c'est fort dommage voire très génant quand on
a des éléments qui sont repris dans de nombreux squelettes
(par exemple un haut de page ou un menu) et qu'il faut aller
faire les même modifs à la main dans 10 fichiers...
cf. ma proposition à ce sujet ci-dessous
Est-ce que quelqu'un peut m'expliquer pourquoi ça n'est pas
possible,
ou alors me donner un lien dans la doc qui me l'explique SVP.
Il me semble qu'on a déjà eu plusieurs fois des questions
autour de ce sujet sur la mailing liste, mais qu'aucun
document n'existe pour faire la synthèse de ce qu'on peut
faire et pas en mélangeant spip et php. Voici un petit point
que j'espère assez complet.
Pourquoi on ne peut pas :
C'est assez simple, quand spip récupère ton squelette en .html
il le parse pour traiter les boucles, balises et filtres spip.
A ce niveau là ton include en php est donc totalement ignoré.
Ensuite seulement, lorsque tu appelles ta page, le php présent
est évalué (aussi bien celui produit par spip que celui que tu
avais toi même mis dans ton squelette). Cette fois l'include a
bien lieu... mais les boucles ne sont bien sur plus traitées
et elles s'affichent dans ton navigateur.
Quelques remarques découlant de cet ordre de traitement :
- impossible d'inclure avec un include php des fichiers
contenant des instruction spip,
- impossible de passer une variable ou toute expression php en
critère de boucle,
- par contre on peut facilement récupérer des résultat
provenant de spip dans des variables php ( des id d'article,
de rubrique, du texte)
- le php introduit à _l'intérieur_ des boucles spip sera
répété autant de fois que la boucle elle même : très pratique
pour faire des compteurs, etc...
- on peut mettre des structures conditionnelles php (if{...}
else{...} ) autour de php mais il ne faut pas oublier que de
toute façon les boucles dans le if _et_ celles dans le else
seront exécutées ( elles doivent bien sur avoir des nom
différents !) et que ce n'est donc que sur le résultat des
boucles que le if s'appliquera (ie. on affichera que le
résultat d'une des deux parties).
- dernière remarque, niveau performance cette fois : les
instruction spip sont calculées à la génération du squelette
et le résultat est mis en cache, les instruction php
introduite dans le squelette sont par contre évaluées à chaque
fois qu'on appelle la page (donc moins bon au niveau
performance mais très pratique par ex. dans le cas de code
d'authentification qui doit bien être ré-exécuté à chaque
appel.)
Voilà pour le point, j'espère avoir été assez complet et ne
pas avoir dit de bétises. En pratique si on garde ces quelques
règles en tête tout se passe très bien et on peut à peut-près
tout faire.
La seule fonction qui manque selon moi est une instruction
d'inclusion _dans_ spip. Je pense à quelque chose de la forme :
<INCLUSION fichier="mon_menu.html" />.
Cette instruction étant du spip, on pourrait très bien la
faire passer _avant_ le traitement des boucles et donc avoir
un moyen d'inclure des fichiers contenant des boucles spip.
J'ai regardé les changements à faire, celà se passerait à
priori dans la fonction parse_texte() du fichier de calcul du
squelette, juste avant le while sur les boucles (je n'ai pas
actuellement le fichier sur les yeux donc c'est appromatif).
Y-a-t-il des personnes intéressées par cette fonctionnalité ?
qu'en pensent les developeurs ? Il faudrait toucher aux
fonction de calculs du squellette donc je veux pas me lancer
au hasard même si la modif ne semble pas trop complexe.
Alors quelle est la meilleur solution pour faire ce que je
veux ?
soit celle sus-citée, si elle est implémentée un jour, soit
recopie à la main de ta partie dans tous les fichiers, soit
include php mais sans boucles spip alors.
a+
Pierre
PS : cc à la mailing liste de dvp vu que ce mail touche aussi
au dvp de spip
"Accédez au courrier électronique de La Poste : www.laposte.net ; 3615 LAPOSTENET (0,13 /mn) ; tél : 08 92 68 13 50 (0,34/mn)"