Introduction :
La philosophie de SPIP est de pouvoir publier des articles.
Donc on ne peut pas faire un <?php include( "script.php"); ?> dans un article, ca n’est pas fait pour ca.
Pourtant dans certains cas précis, vous pouvez avoir besoin d’afficher dans un article des informations que vous avez calculé et surtout qui peuvent évoluer.
Exemple
Je dois gérer sur mon site une liste des membres d’un club.
Cette liste est modifiée régulièrement, et je l’ai donc mise dans une table de ma base de données.
J’aurai pu créer une page spécifique pour afficher cette liste, et pourtant j’aurai aimé qu’elle s’intègre parfaitement dans l’environnement SPIP, déjà niveau design, mais aussi qu’on puisse faire une recherche SPIP sur la partie fixe de l’article (autour de la liste), qu’elle apparaisse dans les rubriques, etc.
J’aurai également pu utiliser la fonction de redirection d’article, mais elle ne me plait pas non plus parce que j’ai envie d’utiliser une fonctionnalité importante de SPIP qui est le cache des pages !
Je vais donc vous montrer comment j’ai fait !
Avantages :
Par rapport au développement d’un partie spéciale d’un site, cette solution permet :
de garder une arborescence homogène avec les rubriques de SPIP, et compatible avec le moteur de recherche.
de pouvoir habiller un script dans un article et donc de le modifier facilement.
de bénéficier du moteur de cache de SPIP.
Sécurité :
Pour une question de sécurité, chaque script proposé dans les articles DOIT être inscrit dans une liste de scripts autorisés, pour ne pas que chaque rédacteur puisse faire n’importe quoi avec n’importe quel script !
Concrètement :
Ce que nous allons pouvoir faire c’est inclure à n’importe quel endroit de l’article la commande suivante :
#INCLURE (mon_script.php3)Ceci plusieurs fois, et avec plusieurs scripts différents.
Le filtre qui va bien
J’ai créé un filtre appelé "autoriser_php" à appliquer sur le champs voulu (en particulier #TEXTE)
Voici ce filtre, à ajouter au fichier « mes_fonctions.php3 »
- /*****************************************************************************/
- /** Cette fonction permet de lancer un script PHP dans un article
- /**
- /** La syntaxe est la suivante :
- /** #INCLURE ( nom_fichier )
- /**
- /** Auteur : F. Quointeau
- /** Version : 0.0.2
- /** Date : 16 Mai 2004
- /*****************************************************************************/
- function autoriser_php( $texte) {
- // Dossier où sont stockés les scripts
- $dossier_inclus = './';
- // Liste des scripts autorisés
- 'mon_premier_script.php3',
- 'mon_second_script.php3'
- );
- // Les fichiers inclus autorises sont : *.php, *.php3, *.php4, *.phtml, *.htm, *.html, *.inc
- $chaine_recherche = '/#INCLU[R|D]E( *)\(( *)([^\)]*\.(php|php3|php4|phtml|htm|html|inc))( *)\)/i';
- // Recherche la chaine #INCLUDE(script)
- // Verifie le droit d'inclure ce fichier script !
- $autorise = false;
- }
- if( $autorise == true) {
- // Verifie que le fichier existe
- // Vide le buffer de sortie
- $affichage_php = '';
- // Et lance le fichier inclu !!!
- include( $dossier_inclus . $resultats[3]);
- } else {
- $affichage_php = "<b>#INCLURE: Le fichier de script n'existe pas !</b>";
- }
- } else {
- $affichage_php = "<b>#INCLURE: Script NON autorisé !</b>";
- }
- // Attention, n'effectue qu'un seul remplacement à la fois !
- }
- return( $texte);
- }
Attention : Au début de la fonction, il y a un tableau php qui décrit la liste des scripts qui ont le droit d’être lancé à partir d’un article. Pensez à le mettre à jour avec vos scripts.
Dossier des scripts
Si vous souhaitez mettre vos scripts dans un dossier spécial, mettez également le chemin des scripts dans la variable $dossier_inclus au début de la fonction filtre. Par exemple :
$dossier_inclus = 'mes_scripts/';Notez le ’/’ obligatoire à la fin du dossier.
Mais vous pouvez aussi « cacher » vos scripts (non disponibles par une requête HTTP dessus) en les placant en amont du dossier racine du site web :
$dossier_inclus = '../mes_scripts_caches/';Attention, en fonction de votre hébergeur, vous n’aurez pas forcément la possibilité de le faire !
Le script des familles :
Voici le script que vous voulez promouvoir :
- <?php
- ?>
Puissant, mais vous allez devoir l’écrire sous cette forme :
- <?php
- $affichage_php = "Hello World !";
- ?>
Vous suivez ?
Vous ne pouvez pas vous permettre d’afficher sauvagement vos informations directement par un echo( ), celles-ci ne seraient pas prises en compte dans le cache de SPIP, et souvenez-vous que votre script travaille à l’intérieur d’un filtre, et qu’il y a peut être d’autres filtres qui attendent derrière :-)
Et maintenant, comment relier le tout ?
Créez un article comme celui-ci par exemple :
Bonjour,
voici le résultat de ma fonction :
#INCLURE (mon_premier_script.php3)
HopCréez ensuite un fichier mon_premier_script.php3 qui contient le script énoncé plus haut ; mettez le dans le dossier de SPIP si vous n’avez pas spécifié de dossier dans la variable $dossier_inclus (par défaut elle contient le dossier courant).
Dans votre squelette, vous devez avoir quelque chose du genre :
<BOUCLE_1 (ARTICLES) {id_article}>
[(#TEXTE|autoriser_php)]
</BOUCLE_1>J’ai appliqué le filtre "autoriser_php" à l’affichage de #TEXTE.
Et votre article affiche désormais :
Bonjour,
voici le résultat de ma fonction :
Hello World !
HopPour aller un peu plus loin...
Imaginons que vous ayez besoin de récupérer une variable de l’url dans votre script. Les variables globales de SPIP sont accessibles depuis votre script, puisqu’il fonctionne à l’intérieur d’un filtre SPIP.
Regardez le script suivant
- <?php
- // Ma variable
- $id_machin = $GLOBALS['id_machin'];
- $affichage_php = "Hello machin n°$id_machin";
- ?>
Je récupère la variable globale $id_machin et je l’affiche dans mon script. Cette variable globale est tout simplement une des variables passées en paramètres.
Si j’essaye l’url :
article.php3?id_article=x{{&id_machin=11}}
J’aurai alors l’affichage :
Bonjour,
voici le résultat de ma fonction :
Hello machin n°11
HopC’est d’autant plus pratique que SPIP va générer un cache pour TOUTES les url différentes.
Fort heureusement, sinon l’affichage de
article.php3 ?id_article=x&id_machin=1
serait le même que l’affichage de
article.php3 ?id_article=x&id_machin=2
puisque la page article.php3 ?id_article=x est à priori déjà dans le cache.
Attention toutefois à ne pas remplir votre cache de millions de fichiers si votre script peut comporter des millions de combinaisons de paramètres dans l’url !
Récupérer des variables globales de SPIP
En plus de pouvoir récupérer des variables de l’url, vous pouvez récupérer des variables de l’environnement SPIP, comme celle-ci :
$GLOBALS['spip_lang']
qui vous permet de récupérer la langue courante (si vous utilisez SPIP multilingue). Ca peut en effet être très pratique si vous avez besoin de générer un affichage « localisé » avec votre script. [1]
Mise en garde avec MySQL
SPIP utilise par défaut la connexion courante à la base de données MySQL. Autrement dit, si dans votre script, vous ouvrez une base MySQL autre que celle utilisée par SPIP, celui-ci n’aura plus accès à sa base une fois le filtre exécuté.
Pour remédier à ca, il y a deux solutions :
Utiliser la base de SPIP. Pour avoir la base toujours ouverte au début de votre script, utilisez
include_ecrire( "inc_connect.php3") ;
En effet ce sript ouvre la base seulement si elle n’est pas déjà ouverte, et l’avantage c’est que vous n’avez pas besoin de gérer vous même les paramètres d’ouverture.
Demander à SPIP de faire des accès complets à la base (avec sélection de la base à chaque requête). Pour ca, renseignez la variable
$mysql_rappel_connexion = true ;
dans mes_options.php3 [2].
Exemple d’utilisation :
- <?php
- include_ecrire( "inc_connect.php3");
- $ma_requete = mysql_query( "SELECT id, nom, prenom, DATE_FORMAT(naissance, '%d/%m/%Y') as naissance, FROM utilisateur ORDER BY nom,prenom");
- if( $ma_requete) {
- $affichage_php .= "<table cellpadding=\"2\" align=\"center\" border=\"0\" class=\"spip\">\n";
- $affichage_php .= "<tr align=\"center\" class=\"row_first\"> <td><b>Nom</b></td> <td><b>Date de naissance</b></td> </tr>\n";
- $affichage_php .= "<tr class=\"row_" . ($ncr_numero_ligne++ % 2 ? 'odd' : 'even') . "\">";
- $affichage_php .= "<td>" . $mon_resultat["nom"] . " " . $mon_resultat["prenom"] . "</a></td> <td align=\"right\">" . $mon_resultat["naissance"] . "</td>";
- $affichage_php .= "</tr>\n";
- }
- $affichage_php .= "</table>\n";
- }
- }
- ?>
Conclusion
Attention, ceci ne fonctionne que dans la partie publique évidemment !
J’utilise actuellement ce script sur mon site, et ca fonctionne plutôt bien ! Et ce qui est génial, c’est que le cache est géré correctement par SPIP.
Notez : la page est regénérée quand elle a expirée, et pas quand le résultat de votre script a changé !

