Carnet Wiki

Filtre modele_argument

Comment récupérer un argument de modele qui n’est pas nommé ?

class fonctionne bien dans les cas simples, par exemple avec <separateur|rouge>, #ENV{class} vaudra ’rouge’ dans le code du modèle... mais class est désespérément vide lorsque l’argument contient un espace. Par exemple avec <unmodele|un texte argument ici avec un ou des espaces>.

Fort heureusement, dans les modèles, #ENV{args} contient l’ensemble des arguments passés au modèle, y compris cet argument non nommé. Dans le tableau args, la clé et la valeur seront identiques et donc dans l’exemple donné ci dessus, le tableau args vaudra :
['un texte argument ici avec un ou des espaces' => 'un texte argument ici avec un ou des espaces']. Et on peut donc y récupèrer les valeurs voulues.

Fonction (filtre) modele_argument

Dans un modèle :
-  [(#ENV*|modele_argument)] accède la valeur du 1er argument passé, qu’il soit nommé ou pas
-  [(#ENV*|modele_argument{2})] accède la valeur du 2eme argument passé, qu’il soit nommé ou pas
etc

/**
 * @param array|string $env = #ENV* tableau de l'environnement reçu par le modèle
* @param string|int $index : argument qu'on veut récupérer dans le tableau des arguments, nommé ou n° d'ordre à partir de 1
 * @return string valeur de l'argument après le |
 *
 * @used_in modeles/licence.html (cf ci dessous)
 * @see https://git.spip.net/spip/spip/issues/4856
 */

function modele_argument ($env, $index=1) : string {
	if (!is_array($env)) {
		$env = unserialize($env);
	}
	if (!is_array($env) or !isset($env['args']) or !is_array($env['args'])) {
		return '';
	}
	if (isset ($env['args'][$index])) {
		return $env['args'][$index];
	}
	$index = (int)$index;
	if (($index<=0) or (count($env['args']) < $index)) {
		return '';
	}
	$v = '';
	for ($i=1; $i<=$index; $i++)  {
		$v = array_shift($env['args']);
	}
	return $v;
}

Exemple d’usage

Voici un modele “licence” qui permet au plus simplement de spécifier une licence sans requérir un argument nommé.

[(#REM)
Exemples : <licence|CC BY SA JLuc> , <licence|domaine_public>, <licence|CC BY SA truc|lien=https://....>
]
[<div class="modele_licence">Licence (#ENV*|modele_argument)
	[<a href="(#LIEN|attribut_html)" target="_blank">(voir)</a>]
</div>]
JLuc - Mise à jour :2 September 2025 at 23:12