Subtilité non documentée de la fonction include_spip

Bonjour,
Je viens de découvrir une subtilité de la fonction include_spip (de SPIP).

En effet, elle accepte comme paramètre (pour un plugin activé), par exemple :

  • inc/nomDuFichier
  • plugins-dist/nomDuPlugin/inc/nomDuFichier

En revanche, elle n’accepte pas :

  • nomDuPlugin/inc/nomDuFichier

Remarque : Je connais le mécanisme des priorités pour la recherche de fichier, mais dans certains cas il peut être nécessaire de le contourner.

Ceci ne semble pas intuitif, aussi il serait intéressant de l’ajouter dans la documentation : https://programmer.spip.net/include_spip

Cordialement,
Equipement

Seule la première syntaxe est licite, et applique la recherche par ordre de chargement des plugins.

La seconde syntaxe est une erreur et va casser si jamais tu déplace/renomme le dossier de ton plugin. Elle fonctionne (par chance) parce que la racine du SPIP fait partie des dossiers dans lesquels on recherche l’inclusion.

La troisième syntaxe est tout autant une erreur, mais qui ne marche pas.

Si tu fois contourner le mécanisme d’inclusion automatique de SPIP il faut utiliser quelque chose comme

include_once _DIR_PLUGIN_TRUC . 'inc/nomDuFichier.php'

comme par exemple ici urls/generer_url_forum.php · master · spip-contrib-extensions / comments · GitLab

Cela marchera toujours même si le plugin truc est déplacé dans l’arborescence

1 « J'aime »

En pratique, j’ai utilisé :

if (defined('_DIR_PLUGIN_TRUC')) {
	include_spip(_DIR_PLUGIN_TRUC . 'inc/nomDuFichier');
}

Est-ce que c’est viable ?

Les constantes de DIR sont déjà absolues (ou relatives à la racine du site), donc tu n’as pas à utiliser include_spip (qui est une fonction interne plus lourde et qui ne soit servir que pour le relative dans le path), plutôt que directement include_once comme l’a indiqué @cerdic .

  • chemin absolu => utilise include_once directement
  • chemin relatif ET pouvant être surchargé par un même chemin relatif prioritaire dans le path : utilise include_spip

Pour le cas précité, je viens d’adopter include_once, qui sera effectivement plus performant.

Maintenant, le sujet initial était d’inviter à signaler dans la documentation de la fonction include_spip, qu’un chemin relatif tel que nomDuPlugin/inc/nomDuFichier n’est pas accepté.

Mais ce n’est pas qu’il n’est pas « accepté » par la fonction comme s’il y avait une vérification qui le refusait, c’est juste qu’il n’a aucun sens, sans rapport spécifiquement avec les « nomDuPlugin » : les chemins relatifs attendent tous un chemin relatif à un dossier du path. Et les dossiers du path sont : La notion de chemin - Programmer avec SPIP 4

Il n’y a que le contenu de ces dossiers, et seulement ça, qui peut être mis comme chemin relatif.

Cette explication gagnerait à figurer dans include_spip - Programmer avec SPIP 4

Ces constantes n’ont pas vocation à disparaître ? Il me semble avoir vu passer ça.

Ah ? Parceque je viens d’en préparer une doc
https://www.spip.net/ecrire/?exec=article&id_article=7336

Ces constantes n’ont pas vocation à disparaître ? Il me semble avoir vu passer ça.

A terme oui, mais pour l’instant on n’en est pas encore là