mercredi 7 janvier 2009, par H2Fooko
Afin d’éviter de paraphraser ce qui a déjà été ecrit, j’ai décidé d’essayer de faire un résumé comparatif de ce qui permet d’exécuter des fonctions PHP dans des articles de SPIP.
En effet les forums des contributions sur le sujet permettent de s’en sortir pour pouvoir rendre les articles un peu plus dynamiques.
L’inconvénient est d’avoir le temps de se faire une synthèse car il faut souvent compulser de nombreuses pages avant d’avoir la solution.
J’ai relevé 3 méthodes qui fonctionnent avec la version 1.9.2d de SPIP, apparemment incompatibles avec la version 2. Pourtant j’ose espérer que la 3ème méthode (qui est en fait une fonctionnalité de SPIP) fonctionne toujours.
Ce tableau dépasse certainement les limites de votre écran, aussi ai-je facilité les passages d’une colonne à l’autre au moyen des liens : « < ^ > ».
Caractéristiques |
Méthodes | ||||||||||||||
1: INCLURE | 2 | 3: MODELE SPIP | |||||||||||||
Auteurs |
GoUaRfIg ! , Michel Maillard, Jim WANDERSCHEID
|
||||||||||||||
Liens des contributions utilisées |
Sur SPIP Contrib pour l’article de fond ;
|
||||||||||||||
Mes contributions | |||||||||||||||
Difficultés rencontrées |
|
|
|
||||||||||||
Notions SPIP sousjacentes |
Filtre appliqué à des balises.
|
Filtre appliqué à des balises.
|
Modèles avec la balise #ENV pour le passage des paramètres par variable d’environnement.
|
||||||||||||
Syntaxe d'appel | #INCLURE(ma_fonction.php)
|
<ma_fonctionNNN> |
|||||||||||||
Syntaxe avec passage de paramètres |
#INCLURE(ma_fonction.php?par1=XXX&par2=YYY) par1 et par2 sont 2 paramètres passés à la fonction. XXX et YYY sont respectivement les valeurs données à ces paramètres . ?, & et = sont nécessaires à la syntaxe. |
<php_cache_ma_fonction|par1=XXX|par2=YYY> |
<ma_fonctionNNN|par1=XXX|par2=YYY> |
||||||||||||
Exemples |
|
Bien le Bonjour de H2Fooko |
|
||||||||||||
Localisation des scripts |
Précisé par la variable $dossier_inclus du filtre autoriser_php, il suffit d’indiquer le nom et le chemin du répertoire que vous aurez créé préalablement. En ce qui me concerne :
Il suffit d’uploader ensuite le script PHP à cet endroi.
|
Précisé par la variable $ScriptDir du filtre recherche_php, il suffit d’indiquer le nom et le chemin du répertoire que vous aurez créé préalablement. En ce qui me concerne :
J’ai délibérémment pris le même répertoire que pour la première méthode afin d’utiliser indifféremment la première ou la seconde méthode.
|
Le répertoire /modeles/ doit être créé à l’intérieur du répertoire ./squelettes/ s’il n’existe pas déjà. (Il faudrait étudier les variables intrinsèques de SPIP pour éventuellement changer la localisation des scripts).
|
||||||||||||
extension |
|
|
Le contenu peut être du pur PHP à l’exception des variables passées en paramètre.
|
||||||||||||
Fichiers de la distribution à modifier |
|
|
Pas de modification de fichier de la distribution de SPIP. Seul le script PHP est à déposer dans ./squelette/modeles/ en renommant l’extension du fichier de script PHP en HTML et en enveloppant les variables passées en paramètre par "#ENV{ }".
|
||||||||||||
Comportement dans la zone privée de SPIP |
L’image ci-dessous correspond à une copie de l’espace privé de cet article.
Un examen de la source HTML de l’espace privé donne : |
L’image ci-dessous correspond à une copie de l’espace privé de cet article.
Un examen de la source HTML de l’espace privé donne : |
L’image ci-dessous correspond à une copie de l’espace privé de cet article.
Un examen de la source HTML de l’espace privé donne : Notez qu’il s’est écoulé 4mn entre la copie d’écran et la génération de la source HTML de la page privée !
|
||||||||||||
Mes suppositions. |
Le squelette de la page privée doit être différent de celui de la page publique. Il n’a probablement pas reconnu le filtre appliqué : « autoriser_php » puisque l’on retrouve en clair « #INCLURE(heure.php) » dans cette page privée.
|
Le squelette de la page privée doit - là aussi - être différent de celui de la page publique. Il n’a probablement pas reconnu le filtre appliqué : « recherche_php » puisque l’on retrouve en clair « <php_cache_example0> » et un peu plus loin « <php_cache_example33> » dans cette page privée.
|
Un modèle SPIP est par définition un mini squelette, il a donc été inclu dans le squelette de la page privée (pas besoin de reconnaissance), il a donc rendu tout naturellement un résultat au script PHP contenu dans ce modèle. |
||||||||||||
Sécurité |
Voir le paragraphe consacré sur le site du contributeur.
|
Voir le paragraphe consacré sur le site du contributeur.
|
ATTENTION
contrairement aux 2 autres méthodes il faut s’assurer que votre répertoire /modeles/ soit protégé par un fichier .htaccess.
sauf si le code doit écrire des fichiers sur le serveur web !
En effet si on essaye d’accéder au script directement en pointant son adresse http avec votre navigateur on peut récupérer la source de ce script dans la source de la page html rendue !
Très génant si votre script contient un mot de passe pour se connecter à votre base de données par exemple ! Le fait que le script soit enveloppé dans un fichier html, si ce script génère une erreur (il attend par exemple des paramètres non passés) la page pointée est quand même rendue avec du PHP en clair dans la source !
|
||||||||||||
Compatibilité SPIP | |||||||||||||||
Exemples sur ce site |
retour
3. Modifications du code.
Mes contributions sont mises en évidence sur fond jaune dans les sources ci-dessous. Les sources des filtres « autoriser_php » et « recherche_php » et la fonction « my_include » sont à inclure dans le fichier « mes_fonctions.php » du répertoire squelette. Ce fichier est à créér ex-nihilo s’il n’existe pas déjà.
J’ai aussi mis des liens sur les fonctions php utilisées pointant vers une documentation en ligne. Celle ci s’ouvre dans le cadre (iframe), un simple clic droit permettrait de l’ouvrir dans une nouvelle fénêtre. Dans le cas d’une visualisation dans le cadre il suffit de cliquer sur le bouton « précédente » de votre navigateur pour revenir au code source.
J’ai pu mettre au point l’expression régulière de recherche de l’URL de passage des paramètres tout en tenant compte de l’espace introduit par SPIP avant chaque point d’interrogation.
Je suis impressionné par la puissance des expressions régulières qui - bien employées - permettent de récupérer dans le tableau "résultat" ce que l’on souhaite.
Le test permet de détecter l’existence d’une URL et dans l’affirmative de préparer l’isolement de la chaine URL traitée ensuite avec la fonction "parse_str" localisée plus loin.
Le reste est décrit sur le site des contributions des auteurs.
retour
Fonction « my_include »
J’ai seulement rajouté à la fonction "my_include" le traitement d’une pseudo URL passée par variable et encadrée par les caractères "|" et ">".
Le test sur le premier caractère me permet de détecter ou non l’existence de cette pseudo URL. Ca peut paraître un peu léger, mais en fait si on arrive jusque là sans erreurs c’est que l’expression régulière a repéré une chaîne en principe conforme : un autre test est pour moi superflu.
Les 2 caractères extrêmes me permettent d’isoler le contenu de l’URL (Voir les difficultés rencontrées). Et pour être conforme à ce qu’attend la fonction "parse_str", je remplace tous les "|" par des "&".
Le reste des explications se trouve sur le site de l’auteur.
retour
Filtre « recherche_php »
Ici encore j’ai bénéficié du testeur d’expression régulière pour apprendre à isoler ma pseudo URL. J’ai aussi exploité au mieux l’utilisation du tableau "mymatches" :
retour
Squelette « article.html »
Ci-dessous sur fond jaune la façon d’appliquer les 2 filtres "autoriser_php" et "recherche_php" à la balise #TEXTE dans le squelette "article.html".
retour
Téléchargement
En plus des filtres et squelette évoqués ci-dessus, j’ai mis cet article sous forme de fichier pdf avec tous les liens grâce aux outils pdf.