Cette fonction permet d’exécuter les traitements dynamiques à effectuer lorsqu’une balise dynamique est appelée, notamment si un formulaire a été soumis. La fonction peut retourner une chaîne de caractère (qui sera affichée sur la page demandée) ou un tableau de paramètres qui indique le nom du squelette à récupérer et le contexte de compilation.
Les traitements
Pour 2 raisons je n’en parlerai pas :
- je n’ai toujours pas compris comment ça fonctionne,
- ce n’est plus très utile depuis que SPIP intègre un mécanisme plus simple appelé « formulaires CVT » (Charger, Vérifier, Traiter) qui s’appuie aussi sur cette fonction, mais de façon transparente.
L’affichage
Ce que retourne la fonction est alors affiché sur la page.
– Si c’est une chaine, elle est renvoyée telle quelle.
– Si c’est un tableau, il indique quel squelette appeler avec quel contexte. Il se présente sous cette forme :
return array("adresse_du_squelette",
3600, // duree du cache
array( // contexte
'id_article' => $id_article,
)
);
Exemple
balise #MAINTENANT
Création d’une balise dynamique qui affiche l’heure système depuis un squelette, sans mise en cache. Testé en SPIP4.2, marche aussi en 5.0.
Prise en compte des fonctions
<?php
// squelettes/mes_fonctions.php
# ...
include_spip('maintenant');
# ...
Déclaration
<?php
// squelettes/maintenant.php
declare(strict_types=1);
/**
* balise dynamique MAINTENANT
*/
use Spip\Compilateur\Noeud\Champ;
/**
* Définition de la balise #MAINTENANT.
* @param Champ $p
* @return Champ
*/
function balise_MAINTENANT_dist(Champ $p): Champ {
return calculer_balise_dynamique(
$p,
'MAINTENANT',
[],
);
}
/**
* Partie "statique" de la balise #MAINTENANT.
*
* @param array $args
* @param array $context_compil
* @return array
*/
function balise_MAINTENANT_stat(array $args, array $context_compil): array {
$tz = ini_get('date.timezone') ?: 'UTC';
return [
// Format
$args[0] ?? 'Y-m-d H:i:s',
// Timezone
$args[1] ?? $tz,
];
}
/**
* Partie dynamique de la balise #MAINTENANT.
* C'est ici qu'on récupère la date système
* @param string $format
* @param string $timezone
* @return string
*/
function balise_MAINTENANT_dyn(string $format, string $timezone): string {
include_spip('inc/filtres_dates');
$tz = new \DateTimeZone($timezone);
$now = new \DateTimeImmutable('now', $tz);
return is_callable($format)
? $format($now->format('Y-m-d H:i:s'))
: $now->format($format);
}
Squelette de test
[(#REM) fichier squelettes/test.html ]
Usage brut : #MAINTENANT
<hr />
Usage encadré: [Année courante : <strong>(#MAINTENANT{Y})</strong>]
<hr />
Dans une boucle:
<BOUCLE0(ARTICLES){0,1}>
#TITRE<br/>
#MAINTENANT{affdate_court} - #MAINTENANT{affdate,UTC}
</BOUCLE0>