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>]