Page d'accueil | Contact | Plan | Droits d'auteur | Login membres

Visitez quelques sites des membres d'Eklesia.net

Niveau expert
Inclure un script PHP dans un article

À quoi ça sert, d’inclure des scripts PHP dans les articles SPIP ?

SPIP est un système de gestion de contenu Internet travaillant avec du texte, des images, des documents attachés.

Or, pour certaines fonctionnalités d’un site plus évolué, il faut pouvoir réagir en fonction de ce que le visiteur a fait.

Juste un exemple pour vous convaincre de la nécessité de cette fonctionnalité :

Afficher dans SPIP la page de réception ou traitement d’un formulaire : il faut analyser si tous les champs ont été correctement remplis, traiter les informations, les sauvegarder dans une base de données, envoyer une confirmation par email et afficher une page disant simplement "merci".

Alors qu’il est tout à fait possible de créer le formulaire dans un article SPIP, la page de traitement ne peut pas être générée sans recours à du PHP pur et dur.

Création du script PHP

Créer un script PHP (p.ex. monscript.php) et le sauvegarder dans un répertoire, p.ex. /squelettes/scripts/.

Tout ce qui doit apparaître sur l’écran doit être rassemblé dans la variable $affichage_php. C’est n’est que ce qu’il y a dans cette variable que SPIP va afficher.

Donc au lieu d’écrire :


echo("Bonjour, le monde !<br />");
echo("Comment ça va aujourd'hui ?");

on écrira :


$affichage_php = "Bonjour, le monde !<br />";
$affichage_php .= "Comment ça va aujourd'hui ?";

Exemple de script :


<?php

  global $affichage_php;

  $affichage_php = "Bonjour, le monde !<br><br>";
  $affichage_php .= "Comment ça va aujourd'hui ?";

?>

Création de l’article de SPIP

Créer un nouvel article dans SPIP. Indiquer un titre.

Pour appeler le script à partir de cet article, indiquer dans le texte de l’article :


#INCLURE(monscript.php)

Modification du fichier mes_fonctions.php3

Le fichier mes_fonctions.php3 peut être utilisé pour stocker des fonctions qui sont appelées directement par les squelettes de SPIP.

Si le fichier mes_fonctions.php3 n’existe pas encore à la racine de SPIP, il faut le créer.

Ajouter dans le fichier mes_fonctions.php3 les lignes suivantes :


//la fonction récupère le texte de l'article, SPIP le fournit dans la variable $texte
function autoriser_php($texte) {

  //si le texte de l'article commence par #INCLURE, c'est le signal d'exécuter un de mes scripts
  if(substr($texte,0,8) == '#INCLURE') {

     //dossier où sont stockés les scripts
     $dossier_inclus = 'squelettes/scripts/';

     //liste des scripts autorisés (à modifier, naturellement)
     $scripts_autorises = Array(
        'monscript.php',
        'unautrescript.php'
     );

     //les fichiers inclus autorisés sont : *.php, *.php3, *.php4, *.phtml, *.htm, *.html, *.inc
     $chaine_recherche = '/#INCLU[R|D]E( *)\(( *)([^\)]*\.(php|php3|php4|phtml|htm|html|inc))( *)\)/i';

     //pour séparer les variables éventuellement dans l'Url du nom du script
     $pos_php = strpos($texte,'php');
     $len_php = strlen($texte);
     $texte_1 = substr($texte,0,$pos_php+3).")";
     $texte_2 = substr($texte,$pos_php+10,$len_php-$pos_php-11);
     parse_str($texte_2);
     $texte = $texte_1;

     //recherche la chaine #INCLUDE(script)
     while( preg_match( $chaine_recherche, $texte, $resultats)) {

        //vérifie le droit d'inclure ce script
        $autorise = false;
        reset($scripts_autorises);
        while($script = each( $scripts_autorises)) {
           if(strcasecmp($script[value], $resultats[3]) == 0) {
              $autorise = true;
           }
        }

        if($autorise == true) {

           // Vérifie que le fichier existe
           if( file_exists($dossier_inclus.$resultats[3])) {
              $affichage_php = ''; // Vide le buffer de sortie
              include($dossier_inclus.$resultats[3]); // Et lance le fichier inclu
           } else {
              $affichage_php = "<b>#INCLURE: Le fichier de script n'existe pas !</b>";
           }
        } else {
           $affichage_php = "<b>#INCLURE: Script NON autorisé !</b>";
        }

        $texte = preg_replace( $chaine_recherche, $affichage_php, $texte, 1);

     }

  }

  return($texte);

}

Modification des squelettes

Dans les squelettes SPIP, au lieu d’utiliser :


#TEXTE

pour afficher le texte de l’article, utiliser systématiquement :


[(#TEXTE|autoriser_php)]

c.à.d. afficher le #TEXTE, mais le passer auparavant par la fonction autoriser_php définie dans mesfonctions.php3.

Plusieurs fonctions peuvent être appelées. Séparer les focntions par des signes pipe « | », comme ceci :


[(#TEXTE|autoriser_php|colorier_recherche)]

Ceci exécutera les deux fonctions autoriser_php() et colorier_recherche() avant de passer le code au navigateur.

Quelles variables utiliser ?

Se méfier si on veut passer des variables PHP dans l’Url.

Il ne faut pas que des variables avec le même nom soient déjà utilisées par SPIP.

Comme on ne connaît pas tout ce qu’ils utilisent, je suggère d’utiliser des variables du style :


#INCLURE(monscript.php?eklesia_annee=2004&eklesia_mois=8)

Il y a peu de chance que les développeurs de SPIP utilisent des noms de variable qui commencent par "eklesia_".