En deux mots
En substance, pour répondre a cette requête, SPIP appelle le fichier index.php avec l’argument exec en chaine de get :
- il va chercher le fichier exec/truc.php
- il cherche dedans la fonction exec_truc()
- il cherche dedans la fonction exec_truc_dist()
Par défaut exec_truc_dist() est défini dans le fichier exec/truc.php de spip, ce qui permet, en définissant sa fonction exec_truc() de personaliser le actions de truc sans toucher au script truc.php de spip.
Comment cela marche-t-il en pratique ?
Include_fonction(’truc’)
C’est la première fonction appelée pour gérer cette demande.
C’est elle qui regroupe toutes les actions pour savoir quelle fonction exécuter, quel fichier charger pour assurer l’action ’truc’
- regarde si la fonction exec_truc est déjà définie
- sinon cherche le fichier exec/truc via la fonction include_spip ci-dessous
- regarde si la fonction exec_truc est définie -> dit que c’est celle la que l’on veut utiliser
- regarde si la fonction exec_truc_dist est définie -> c’est cette fonction que l’on veut utiliser
Les inclusions des fichiers php de SPIP via include_spip()
Par exemple include_spip(’inc/charsets’).
Elle passe par la fonction find_in_path ci-dessous pour chercher le fichier au bon endroit
La fonction include_ecrire(’inc_charsets’) qui était utilisé en <=183 reste accepté pour compatibilité des scripts, mais est moins rapide car elle doit assurer le changement de convention de nommage.
Ou index.php va-t-il chercher truc.php ?
Par défaut, il trouve le fichier exec/truc.php dans ecrire. Mais ce fichier n’est pas cherché uniquement à cet endroit.
La fonction find_in_path(’exec/truc.php’) est chargée de trouver le fichier. Elle est utilisée à chaque recherche d’un fichier de SPIP (squelettes, fichiers de langues, charset, …)
Cette fonction cherche les fichiers dans l’ordre :
- Dans $dossier_squelettes qui est une variable personalisée éventuellement par l’utilisateur pour indiquer où sont rangés ses squelettes
- Truc : il est possible de définir plusieurs répertoires dans cette variable en les séparant par des :
- Ex : $dossier_squelettes=’squelettes:autres:perso’
- Truc : il est possible de définir plusieurs répertoires dans cette variable en les séparant par des :
- Dans squelettes/
- À la racine : ./
- Dans formulaires/
- Dans dist/
- Dans ecrire/
Donc il est possible de ’remplacer’ l’usage d’un fichier natif de SPIP comme exec/truc.php en définissant son propre exec/truc.php dans un des dossiers squelettes, ou à la racine (ou dans un dossier plugins, ce sera abordé ultérieurement)
En résumé
En résumé, on peut modifier le comportement d’origine de la requête ?exec=truc
- en définissant sa propre fonction exec_truc() dans un fichier mes_options.php par exemple. Cette fonction peut faire ses propres traitement, ou/et ensuite réinclure le fichier d’origine pour appeler la fonction d’origine.
- en définissant son propre fichier exec/truc.php et y définir la fonction exec_truc().
Discussions par date d’activité
3 discussions
Un petit addendum qui évitera l’arrachage des cheveux des codeurs de plugins modifiant l’espace privé...
Dans le début de la partie « Comment cela marche-t-il en pratique ? », il est dit :
ce qui offre effectivement la possibilité de redéfinir la fonction exec_truc() dans un plugin (sans avoir à copier tout le fichier /exec/truc.php dans le plugin, donc allège considérablement la maintenance du plugin lors des mises à jour de spip).
Mais, pour que cette solution fonctionne il est OBLIGATOIRE de faire un include préalable du fichier truc.php original (/ecrire/exec/truc.php) afin de disposer de l’ensemble des fonctions nécessaires pour le bon fonctionnement de truc.php.
Néanmoins cet include NE peut PAS être fait en utilisant la fonction include_spip() puisque (je cite ESJ qui m’a très efficacement et rapidement dépanné) :
« Ce fichier ne peut etre inclus par « include_spip », car celui-ci va repartir de find_in_path, trouver d’abord celui qu’il vient déjà de charger, et donc croire qu’il n’a rien à faire ».
Il FAUT donc faire cette inclusion en utilisant la fonction include() de php, ce qui donne dans cet exemple :
include(’exec/truc.php’) ;
Merci ESJ !
pour les feignants : une petite bidouille pour ne pas avoir à déterminer quels sont les fichiers de /ecrire/exec/ à intégrer (et diminuer le nombre d’include inutiles),
il suffit donc de faire la liste de tous les fichiers (articles.php, articles_edit.php, rubriques.php...) qui seront modifiés dans le array() : seul celui qui est en cours d’affichage sera chargé.
Répondre à ce message
Avant de chercher à la racine du site, juste après les squellettes, find_in_path regarde s’il ne le trouve pas dans les différents dossiers plugins actifs, non ?
Répondre à ce message
C’est bien mais ca ne fait pas un peu beaucoup de « truc » pour un concept somme toutes assez délicat à comprendre ?
Oui bon d’accord, il y avait marqué « confirmé », je sais :clindoeil
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 :
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.
Suivre les commentaires : |