problème récurrent de fonction non trouvée alors qu'elle est dans le prefixe_fonctions.php du plugin

Depuis le passage en SPIP 4.0 (PHP 7.4 ou 8.0 : idem) avec de nombreux plugins (billetterie, facteur, inscriptions_multiples par exemple) je constate des erreurs « Call to undefined function » à l’appel d’une fonction fournie dans le fichier prefixe_fonctions.php du plugin.

  • L’appel de la fonction peut venir du charger d’un CVT, d’un filtre de balise, d’un pipeline appelé depuis un autre plugin ou autre (?).
  • Un var_mode=calcul ou recalcul permet de ne pas avoir l’erreur : il doit donc y avoir une histoire de cache dans le problème.
  • Pour l’instant un contournement générique du problème consiste à passer la fonction incriminée dans le prefixe_options.php du plugin mais ça ne semble pas très satisfaisant comme « solution »…

Si quelqu’un a une piste ou souhaite plus d’infos voire faire des tests j’ai en ce moment un cas d’usage sur un projet avec le plugin billetterie qui pose le problème.

Merci d’avance pour toute suggestion !

Difficile de répondre de manière aussi générique sans un cas précis en effet

Pour le cas de l’appel depuis charger() c’est tout à fait possible car il peut être évalué en avant tout calcul de squelette (dans le cas d’un post), et donc les fichiers fonctions ne sont pas chargés à ce moment.

En tout cas je ne vois rien de tel sur les sites qu’on a en production en SPIP 4, qui utilisent tous facteur. Pour les 2 autres plugins je n’ai pas de cas d’usage en SPIP 4

Le 13/04/2022 à 02:19, cy_altern via Discuter de SPIP a écrit :

Merci d’avance pour toute suggestion !

Pour répondre de manière générique : c’est relativement normal, les fonctions des fichiers *_fonctions.php ne doivent par défaut n’être utilisée QUE dans les squelettes directement car ça ne concerne que ce qui est chargé au moment des calculs de squelettes. Si une fonction est appelée dans du PHP, alors :

  • soit ça doit être dans *_options.php
  • soit si c’est dans TOUT autre fichier (inc/truc ou *_fonctions etc peu importe), il FAUT charger le fichier avant d’appeler la fonction pour être sûr de l’avoir

Donc pour être carré, il manque peut-être des include_spip().


RastaPopoulos

J’ai constaté également une telle évolution avec SPIP 4, et j’ai dû ajouter des appels à include_fichiers_fonctions() (qui semble avoir été introduit pour) à plusieurs endroits du code.
Je préfére appeler include_fichiers_fonctions() plutôt que de déplacer une fonction dans le fichier d’options.

Une petite recherche me montre que c’est

  • dans des fichiers d’action,
  • et dans une fonction charger d’un CVT.

Le 13/04/2022 à 10:29, JLuc via Discuter de SPIP a écrit :

Je préfére appeler |include_fichiers_fonctions()| plutôt que de déplacer une fonction dans le fichier d’options.

Bah, c’est un peu pelleteuse d’inclure TOUS les fichiers de fonction, si tu sais pertinament que la fonction dont t’as besoin est dans tel fichier truc_fonctions.php… Ya pas à la déplacer dans options, mais inclure LE fichier où elle se trouve avant de l’utiliser quoi. Comme pour n’importe quel include_spip(‹ inc/trucmuche ›).


RastaPopoulos

Oui c’est vrai.
Mais c’était une sécurité car ça reproduit la situation « avant », et ça me garantissait, sur des sites en prod aux graphes d’interaction complexes, qu’il n’y aurait pas d’autres nouveaux besoins non satisfaits, cachés par cette première erreur.

OK : va pour l’inclure_spip du fichier de fonctions du plugin « à la demande » lorsque c’est nécessaire.
(…reste que je ne comprends pas trop pourquoi ce type d’erreur n’apparaissait pas en SPIP 3…)

et pour

les fonctions des fichiers *_fonctions.php ne doivent par défaut n’être utilisée QUE dans les squelettes directement

effectivement Déclarer des fonctions - Programmer avec SPIP 4 dit explicitement

Contrairement aux fichiers d’options, les fichiers de fonctions ne sont pas chargés systématiquement, mais seulement au calcul des squelettes.

…mais à priori lors du chargement d’un CVT à usage public on pourrait s’attendre à ce que justement le fichier de fonctions du plugin ait été appelé (je pense ici explicitement au formulaire commander_billetterie du plugin billetterie dont git blame me dit que l’auteur est un certain R***os)

Pour info, je viens de tomber sur un bug similaire avec champs extras, cf l’erreur suivante :

Fatal error: Uncaught Error: Call to undefined function saisie_balise_structure_formulaire() in plugins/auto/cextras/v4.0.2/cextras_pipelines.php:135 

L’ajout d’un include_spip('saisies_fonctions'); ici spip-contrib-extensions/champs_extras_core - cextras_pipelines.php at master - champs_extras_core - SPIP on GIT corrige bien le problème, mais je m’étonne que personne ne soit tombé sur ce bug avant. Ce qui confirmerait peut-être la piste de @cy_altern à propos changement de comportement depuis SPIP 4.0 car le site sur lequel j’obtiens maintenant l’erreur ne la générait pas en SPIP 3.2.

Et donc la PR qui va bien pour cextras #13 - Inclure saisies_fonctions quand cela est nécessaire - champs_extras_core - SPIP on GIT