< Inclure du code php dans spip >
J’explique ici ma manière d’incruster du code php dans mes articles spip. C’est une méthode qui ne correspondra peut-être pas à tout le monde, mais qui représente pour moi le meilleur compromis sécurité / souplesse.
Les principes de base
Le code php ne doit pas être directement intègré dans les articles. C’est une faille énorme que de permettre d’intègrer du code php via la partie /ecrire/ du site. De plus, inclure du php dans le contenu des articles, celà ne risque-t-il pas de polluer le moteur de recherche interne à spip avec le code en question ?
Les scripts php doivent être placés sur des fichiers à part, dans un répertoire particulier du site (par exemple /php/).
En partant de ces deux principes, on obtient un système claire et confiné. Cette méthode marche aussi avec SPIP 1.7.
La procédure utilisateur
Placer votre script php que je dans un fichier /php/mon_script.php.
Toute personne qui veut inclure ce script dans un de ses articles n’a qu’à inclure le tag suivant : <php_mon_script>
Simple et direct.
Comment modifier spip pour qu’il permette cette procédure ?
Primo, il faut ajouter le filtre suivant dans le fichier de fonctions personnelles : mes_fonctions.php3
// Débranche le retour vers le navigateur et renvoie dans un buffer
ob_start();
include($filename);
// on recupère le buffer
$retour = ob_get_contents();
// on vide et ferme le buffer
ob_end_clean();
return $retour;
}
function recherche_php($t) {
// on remplace les <php_cache_XX>
if (preg_match_all("/<php_cache_([^>]+?)>/i",$t,$mymatches)) {
for ($i=0;$i<sizeof($mymatches[1]);$i++) {
$tag = my_include('php/'.$mymatches[1][$i].'.php');
$t = str_replace($mymatches[0][$i],$tag,$t);
}
}
return $t;
}
Ensuite, il faut remplacer le marqueur #TEXTE par :
$texte = '[(#TEXTE*|propre|texte_script|recherche_php)]';
if (!function_exists('my_include')) {
function my_include($filename){
// Débranche le retour vers le navigateur et renvoie dans un buffer
ob_start();
include($filename);
// on recupère le buffer
$retour = ob_get_contents();
// on vide et ferme le buffer
ob_end_clean();
return $retour;
}
}
// on remplace les <php_XX>
if (preg_match_all("/<php_([^>]+?)>/i",$texte,$mymatches)) {
for ($i=0;$i<sizeof($mymatches[1]);$i++) {
$tag = my_include('php/'.$mymatches[1][$i].'.php');
$texte = str_replace($mymatches[0][$i],$tag,$texte);
}
}
echo $texte;
?>
Exemple de fichier php
Voici un exemple de fichier php qu’on appellera /php/heure.php : <? echo '<span style="color:orange;font-weight:bold">'.date('H:i:s').'</span>';?>
Pour inclure ce fichier dans cette page, il suffit donc d’écrire <php_heure>.
Voici le résultat : 13:26:48
Sécurité
L’avantage de cette procédure est qu’il faut avoir le code ftp pour aller déposer un nouveau script php, ce qui signifie que seuls les personnes qui ont déjà le pouvoir de bouziller votre site peuvent y ajouter des scripts php (qui peuvent toujours être malicieux).
Gestion du cache
Pour certains calculs php qui pourraient être très lourds, ou qui n’auraient pas de sens à être exécutés à chaque visiteur, il est possible de demander à ce que le code php ne soit exécuté que lors du calcul de la page en cache. Le code php que vous avez définit ne sera alors ré-exécuté que lorsque la page sera recalculée par spip.
Pour cela, utilisez le marqueur : <php_cache_XXX>.
Ainsi, en reprenant l’exemple du fichier heure.php :
<php_cache_heure> donne 21:46:26. (à comparer avec l’heure du haut, et si elles sont égales, rechargez cette page. Vous verrez que la première heure bouge, alors que la seconde est figée à l’heure de dernière génération du cache de cet article).
Si jamais vous n’utilisez que la méthode avec cache, alors il n’est pas nécessaire de remplacer #TEXTE par tout le patacaisse écrit plus haut. Remplacez juste #TEXTE par [(#TEXTE|recherche_php)], cela soulagera votre serveur web.
Méthode alternative
Sinon il existe une autre méthode en utilisant des mots clés, qui permet d’insèrer du php ou du javascript directement dans le contenu d’un article SPIP. Insèrer du php dans un article SPIP
11 commentaires
Ok, ca permet d’appeler des scripts php situés hors de l’article et ça c’est très bien. Mais qu’est-ce qui empêche un auteur de mettre directement du php dans son article ? Apparement rien ? N’importe que redacteur peut inclure un truc du genre < ?php son code php pour effacer les fichiers du site ?>. Ok, ca marche que si le user sous lequel tourne apache à des droits d’écriture sur les répertoires... mais bon ! ! !
Bonjour,
Il me semble préférable d’utiliser la méthode précédement évoquée par un membre du comité d’orientation de SPIP, consistant à utiliser un MOT-CLÉ dans les articles. On ferait donc une famille « script php », contenant les mots-clé script-1, script-2, script-machin, script-calcule-l-age-du-capitaine etc., et une boucle spip dans le squelette, avec mot-clé script-php comme paramètre.
La suite est évidente.
Depuis que ce code est (efficacement) modifié pour fonctionner avec SPIP versions 1.7* je ne parviens plus à passer des variables en POST à un article contenant un script php qui les attend... Comment rétablir ce filtage involontaire ?
Bonjour,
"Ensuite, il faut remplacer le marqueur #TEXTE par : "
Je débute en spip et je me demandais où ça se passe ?
Mon probleme est plus complexe, je voudrais executer du code qui utilise une autre base de donnée. Y a t’il un moyen pour faire ca.
Je vous remercie par avance
bien sur tu peux tout faire ... du moment que ta bdd se trouve sur un serveur qui a le droit d’y accéder ! (chez un autre hebergeur faut pas rever)
Bonjour,
Est-ce qu’on peut modifier ça pour passer des paramètres à l’appel du script ?
Du style :
Nico
Moi aussi je me demande où ça se passe... mais je pense qu’ici on n’aura pas la réponse car le dernier post qui pose la question à ce sujet, date d’il y a un an et est toujours sans réponse... de quoi laisser tomber spip
Post resté sans réponse : >Inclure du code php dans spip Bonjour, "Ensuite, il faut remplacer le marqueur #TEXTE par : " Je débute en spip et je me demandais où ça se passe ? 2004-08-26 à 09h02
Moi aussi je me demande où ça se passe... mais je pense qu’ici on n’aura pas la réponse car le dernier post qui pose la question à ce sujet, date d’il y a un an et est toujours sans réponse... de quoi laisser tomber spip
Ca se passe dans le squelette de l’article, le fichier article.html qui se trouve dans le répertoire "dist" du site spip (si tu utilises les squelettes d’origine) ou le fichier article.html de ton squelette. Il faut donc chercher #texte dans ce fichier et le remplacer par ce qui est proposé. En espérant que ce ne soit pas trop tard...
Bonjour moi j’ai une question qui n’a rien à voir. Je voudrais sur mon site que les gens ai la possibilités de me laisser des commentaires est-ce possible ? ? Si oui je travaille avec dreamweaver, pouriez vous m’aidez s’il vous plait ? ?


De temps en temps dans l’article c’est php_cache, de temps en temps c’est _cached...