Appels à SPIP depuis hors-spip

Sur un site SPIP, l’url plugins/leplugin/apidurl.php est appelée depuis l’extérieur et commence par faire

chdir ('../..');
include_once ('ecrire/inc_version.php');
include_once ('config/connect.php');

Peinard, ça ouvrait la porte de SPIP. Mais depuis le passage à SPIP4.4, certains appels, pas tous mais je sais pas lesquels au juste, laissent une erreur dans l’error log de l’hébergement :

PHP Fatal error:  Uncaught Error: 
Call to undefined function SpipLeague\Component\Kernel\param() 
in lesite/ecrire/inc_version.php:47
Stack trace:
#0 lesite/plugins/leplugin/apidurl.php(12): include_once()
#1 {main}\n  thrown in lesite/ecrire/inc_version.php on line 47

Cette ligne 47 définit _DIR_RESTREINT avec

(!is_dir(param('spip.dirs.core')) ? '' : param('spip.dirs.core'))

Je vois bien qu’il y a, au dessus, la ligne
use function SpipLeague\Component\Kernel\{app, param};
qui motive la description de l’erreur comme portant sur SpipLeague\Component\Kernel\param()

… mais alors… qu’est ce qui manque pour que ça passe bien ?

Charger autoload.php …

1 « J'aime »

donc require_once('vendor/autoload.php');

À tout hasard, si tu sais que tu veux avoir SPIP chargé dedans, plutôt que de refaire tout toi-même à la main (et risque d’oublier des choses ou de ne plus être à jour au fil du temps), tu peux pas plutôt faire une action ? Et même une action « api » si tu veux une meilleure URL : action/api_truc.phphttps://le.site/truc.api

1 « J'aime »

Ça semble bien marcher avec l’inclusion du vendor/autoload.php alors merci @marcimat !

Là j’appelle l’url en GET.
Sur d’autres API j’utilise le plugin « http » Serveur HTTP abstrait - Plugins SPIP

@rastapopoulos Tu suggères d’appeler une action… mais pour un appel depuis un autre site, je n’ai jamais envisagé ça.
En POST, donc ?
Spontanément je pense aux arguments sécurisés genre avec le secret_du_site ou son alea_ephemere, inaccessibles sur un autre site… mais je peux aussi gérer la sécu autrement.

Y a t il un exemple d’usage sur la zone ?

J’ai du mal à saisir ce que tu souhaites faire exactement, mais effectivement en général, on fait un fichier action/api_xxx pour être appelé avec /xxx.api ou ?action=xxx.api (ou qqc comme ça) : après tu fais ce que tu veux dans ton fichier d’action … et tout ton SPIP est déjà booté dedans…

Ben justement le plugin HTTP utilise une action « api »… Les actions (en mode api ou pas peu importe) n’ont pas de rapport particulier à GET ou POST, ça dépend totalement de ce que tu mets dedans, et tu fais bien ce que tu veux. :stuck_out_tongue:

  • Une page d’objet ou page=truc, c’est SPIP qui démarre et qui répond avec un template à compiler.
  • Une action, c’est SPIP qui démarre, et qui te laisse répondre dans une fonction PHP

Donc si tu veux avoir un SPIP booté, et contrôler ce que tu renvoies en PHP, c’est bien une action qu’il faut utiliser. :slight_smile:

Oui effectivement, http :slight_smile:

Bien que connaissant les différentes pièces du puzzle, je n’avais pas percuté que je pouvais m’en servir pour créer une API indépendamment du plugin http.

À voir avant le passage à SPIP5 donc.