Bug avec le script de chargeur "spip"

Hello

Sur certains de mes sites historiques, j’utilisais un patch bien pratique qui permettait de charger SPIP depuis un script PHP

avec le passage de SPIP 4.3 à SPIP 4.4 , cela me marche plus

j’obtiens une erreur fatale du type:
Fatal error : Uncaught Error: Call to undefined function SpipLeague\Component\Kernel\param() in /home/zou/www/ecrire/inc_version.php:47 Stack trace: #0 /home//zou/www/_test.php(18): include() #1 {main} thrown in /home//zou/www/ecrire/inc_version.php on line 47

est ce quelqu’un a une astuce pour resoudre ca ?

je redonne ce script :

//
// Charger SPIP
//
if (!defined('_ECRIRE_INC_VERSION')) {
		// recherche du loader SPIP.
		$deep = 2;
		$lanceur ='ecrire/inc_version.php';
		$include = './'.$lanceur;
		while (!defined('_ECRIRE_INC_VERSION') && $deep++ < 6) { 
			// attention a pas descendre trop loin tout de meme ! 
			// plugins/zone/stable/nom/version/tests/ maximum cherche
			//$include = '../' . $include;
			if (file_exists($include)) {
				chdir(dirname(dirname($include)));
				require $lanceur;
			}
		}	
}

if (!defined('_ECRIRE_INC_VERSION')) {
		die("<strong>Echec :</strong> SPIP ne peut pas etre demarre.<br />
			Vous utilisez certainement un lien symbolique dans votre repertoire plugins.");
}

apparemment il suffit d’ajouter l’autoload et cela passe …

ce qui donne au final

<?php

//
// Charger SPIP
//
if (!defined('_ECRIRE_INC_VERSION')) {
	// recherche du loader SPIP.
	require_once __DIR__ . '/../vendor/autoload.php';

	$deep = 2;
	$lanceur ='ecrire/inc_version.php';
	$include = './'.$lanceur;
	while (!defined('_ECRIRE_INC_VERSION') && $deep++ < 6) { 
		// attention a pas descendre trop loin tout de meme ! 
		// plugins/zone/stable/nom/version/tests/ maximum cherche
		//$include = '../' . $include;
		if (file_exists($include)) {
			chdir(dirname(dirname($include)));
			require $lanceur;
		}
	}	
}

if (!defined('_ECRIRE_INC_VERSION')) {
	die("<strong>Echec :</strong> SPIP ne peut pas etre demarre.<br />
		Vous utilisez certainement un lien symbolique dans votre repertoire plugins.");
}

À l’instar de ecrire/inc_version, tu devrais le mettre dans le while… ou alors autant ne pas utiliser de while…

Par ailleurs ton script est faux… je ne sais pas où tu l’as chippé, mais le $deep ne sert strictement à rien dans ton exemple…

Du coup ça revient au même que (si ton script est à la racine) :

if (!defined('_ECRIRE_INC_VERSION')) {
    chdir(__DIR__);
    require_once(__DIR__ . '/vendor/autoload.php';
    require_once(__DIR__ . '/ecrire/inc_version.php';
}

Et si tu ne sais pas, ça doit pouvoir être qqc comme cela ~…

if (!defined('_ECRIRE_INC_VERSION')) {
    $deep = 6;
    $dir = __DIR__;
    $found = file_exists($dir . '/ecrire/inc_version.php';
    while (!$found && $deep-- > 0) {
        $dir = dirname(__DIR__);
        $found = file_exists($dir . '/ecrire/inc_version.php';
    }
    if ($found) {
        chdir($dir);
        require_once('vendor/autoload.php';
        require_once('ecrire/inc_version.php';
    } else {
        throw new \RuntimeException('Impossible de démarrer SPIP');
    }
}
2 « J'aime »

je pense que c’était le lanceur qu’on avait dans les vieux tests au format PHP…

Pour info, si tu as spip-cli installé sur ta machine, tu peux aussi faire un simple

spip php:run --include monscript.php

qui s’occupera de lancer SPIP et faire les initialisations qui vont bien avant d’inclure monscript.php qui n’a donc pas à s’occuper de ça.
J’utilise souvent ça pour du debug ou des bidouilles jetables qui n’ont pas besoin d’être mises au propre.

3 « J'aime »

Merci Marcimat & Cerdic pour ces deux astuces bien pratiques !

J’ai reporté les enseignements de ce fil dans Appeler SPIP depuis un autre programme PHP parce que le wiki c’est bien moins le bazar que le forum, mangez-en.

2 « J'aime »

Oui, c’est bon les kiwis, mangez-en :kiwi_fruit: