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.
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().
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.
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 ›).
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
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)