Appeler des fonctions php dans un article

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

D’après l’article Un nouveau raccourci pour appeler vos fonctions

Nous introduisons la possibilité de faire appel — dans le texte même d’une ressource spip — à des fonctions php.

Nous créons deux raccourcis :

Raccourci Action
[![ma_fonction("var1","var2")]!] Calcule le résultat renvoyé par la fonction ma_fonction avec les paramètres var1 et var2 et stocke le résultat dans le cache de manière statique
[!![ma_fonction("var1","var2")]!!] Insère des instructions dans le cache de spip pour la fonction ma_fonction soit exécutée lors de chaque chargement de page avec les variables var1 et var2

NB : Le nombre de variables pour chaque fonction est libre.

Pour pouvoir utiliser cette nouvelle fonctionnalité, suivez les trois étapes décrites ici.

1. Ajoutez les lignes suivantes dans votre fichier ecrire/mes_options.php3 (à créer si nécessaire).

# On autorise l'usage du php dans le texte des articles (attention: danger; ceci peut mettre en cause la sécurité de tout votre site)
$activer_php = true;

# Autoriser les fonctions à stocker dans le cache ('[![ ]!]')
$activer_fonctions_perso = true;

# Autoriser les fonctions hors cache ('[!![ ]!!]') (nb: $activer_php doit être à true;)
$activer_fonctions_perso_php = true;

# On charge le fichier contenant les fonctions perso
if($activer_fonctions_perso)
{
	if(file_exists("inc_fonctions-perso.php3"))
		require_once("inc_fonctions-perso.php3");
	else if (file_exists("ecrire/inc_fonctions-perso.php3"))
		require_once("ecrire/inc_fonctions-perso.php3");
}

# On empêche propre() de mettre des insécables partout
function avant_propre($texte) {
	$texte = str_replace("[![", "<html>[![", $texte);
	$texte = str_replace("]!]", "]!]</html>", $texte);
	$texte = str_replace("[!![", "<html>[!![", $texte);
	$texte = str_replace("]!!]", "]!!]</html>", $texte);
	return $texte; }

function apres_propre($texte) {

	# On remplace les raccourcis devant être stockés dans le cache
	global $activer_fonctions_perso;
	if($activer_fonctions_perso) {
		while(ereg("\[\!\[([a-z0-9_\"\,\(\)]*)\]\!\]", $texte, $regs)) {
			$retour = eval("return(fct_perso_".$regs[1].");");
			$temp = str_replace(')', '\)', str_replace('(', '\(', $regs[1]));
			$texte = ereg_replace("\[\!\[".$temp."\]\!\]", $retour, $texte); }
	}

	# On crée les instructions php qui s'exécuteront à chaque chargement de page
	global $activer_fonctions_perso_php;
	if($activer_fonctions_perso_php) {
		while(ereg("\[\!\!\[([a-z0-9_\"\,\(\)]*)\]\!\!\]", $texte, $regs2)) {
			$retour2 = "<php> if(file_exists('inc_fonctions-perso.php3')) require_once('inc_fonctions-perso.php3'); else if (file_exists('ecrire/inc_fonctions-perso.php3')) require_once('ecrire/inc_fonctions-perso.php3');\necho fct_perso_".$regs2[1]."; </php>";
			$temp2 = str_replace(')', '\)', str_replace('(', '\(', $regs2[1]));
			$texte = ereg_replace("\[\!\!\[".$temp2."\]\!\!\]", $retour2, $texte); }
	}

	return $texte;

}

2. Modifiez ensuite, aux lignes 353 et suivantes du fichier ecrire/inc_texte.php3, la fonction interdire_scripts de la façon suivante :

// Securite : empecher l'execution de code PHP
function interdire_scripts($source) {
	$source = eregi_replace("<(\%|\?|([[:space:]]*)script)", "&lt;\\1", $source);
	global $activer_php;
	if($activer_php) {
		$source = eregi_replace("<php>", "<?php ", $source);
		$source = eregi_replace("</php>", " ?>", $source);
	}
	return $source;
}

ATTENTION : Cette manipulation est dangereuse, en particulier si des utilisateurs dont vous n’êtes pas sûr ont le droit d’ajouter du texte sur votre site (même dans un forum !).

3. Enfin, créez un fichier inc_fonctions-perso.php3 dans le répertoire ecrire/ et placez-y vos fonctions personnelles, lesquelles devront répondre à deux critères :

  1. Etre nommées en commençant par la chaîne « fct_perso ». Ainsi, la fonction que vous appellerez par le raccouci [![ma_fonction]!] devra être en réalité nommée fct_perso_ma_fonction().
  2. Renvoyer une valeur (pas question d’utiliser un print ou un echo) ;
*

Un exemple est visible à l’adresse http://bologne.org/article.php3?id_....

Discussion

Une discussion

  • 4

    Tout ça est-il valable pour SPIP 1.8.1 ? et a defaut, quelles modifs il faut faire ? merci

    • François

      A vue de nez, il ne doit pas y avoir grand chose de changé (sauf peut-être un peu la numérotation des lignes de ecire/inc_texte.php3. En tout cas, les « points d’entrée » sont toujours bons.

      Il faut essayer,... (puis rapporter l’info ici :))

      François

    • Bah déjà quand je vois dans la procédure qu’on parle du fichier « mes_options.php3 » et non de « mes_fonctions.php3 », ca refroidit mon envie de tester

    • François

      Bah déjà quand je vois dans la procédure qu’on parle du fichier « mes_options.php3 » et non de « mes_fonctions.php3 », ca refroidit mon envie de tester

      Ah bon, pourquoi ? Il se trouve que pour écrire des fonctions utilisant les points d’entrée de inc_texte.php3, c’est bien ecrire/mes_options.php3 qu’il faut utiliser. Où est le problème ?

      François

    • Où est le problème ?

      il a froid, c’est tout :-)

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom