Nous allons voir comment récupérer le type (objet) et l’identifiant d’une boucle pour s’en servir dans les calculs d’une balise.
Balise statique
Avec les paramètres de balise $p
, il est très simple de récupérer objet
et id_objet
:
function balise_DEMO($p){
// on prend nom de la cle primaire de l'objet pour calculer sa valeur
$_id_objet = $p->boucles[$p->id_boucle]->primary;
$id_objet = champ_sql($_id_objet, $p);
$objet = $p->boucles[$p->id_boucle]->id_table;
$p->code = "calculer_balise_DEMO('$objet', $id_objet)";
return $p;
}
function calculer_balise_DEMO($objet, $id_objet){
$objet = objet_type($objet);
return "Objet : $objet, id_objet : $id_objet";
}
Observons les deux fonctions. La première récupère dans la description de la balise le nom de sa boucle parente, le nom de la clé primaire, et demande à récupérer via la fonction champ_sql()
la valeur de la clé primaire. Attention : ce que l’on récupère dans la variable $id_objet
est un code qui doit être évalué en PHP (ce n’est pas une valeur numérique encore).
Une fois ces paramètres récupérés, on demande d’ajouter un code PHP à évaluer dans le code généré par la compilation du squelette (ce code sera mis en cache). C’est ce qu’on ajoute dans $p->code
. Ce code là sera évalué par la suite au moment de la création du cache de la page appelée.
La fonction calculer_balise_DEMO()
reçoit alors les deux arguments souhaités et retourne un texte qui les affiche sur la page.
<BOUCLE_a(ARTICLES){0,2}>
#DEMO<br />
</BOUCLE_a>
<hr />
<BOUCLE_r(RUBRIQUES){0,2}>
#DEMO<br />
</BOUCLE_r>
Ce squelette permet alors de voir le résultat, la balise #DEMO
reçoit des informations différentes en fonction du contexte dans lequel elle se trouve :
Objet : article, id_objet : 128
Objet : article, id_objet : 7
----
Objet : rubrique, id_objet : 1
Objet : rubrique, id_objet : 2
Balise dynamique
Dans le cas d’une balise dynamique, son fonctionnement même empêche de récupérer facilement le type et l’identifiant de la boucle dans laquelle elle est inscrite.
Lorsqu’on a néanmoins besoin de cela, par exemple pour créer des formulaires CVT qui adaptent leurs traitements en fonction du type de boucle, il faut envoyer à la fonction _dyn()
(et par conséquent aux fonctions charger, vérifier et traiter de CVT) le type (objet) et l’identifiant de la boucle en cours.
L’appel à calculer_balise_dynamique()
permet de récupérer des éléments du contexte de compilation. Si l’on demande à récupérer ’id_article’, on l’obtiendra bien dans une boucle ARTICLES
, mais pas dans une boucle RUBRIQUES
. En étant plus précis, lorsqu’on demande une valeur ’id_article’, SPIP fait comme s’il récupérait le résultat d’une balise #ID_ARTICLE
, il cherche donc la valeur dans la boucle la plus proche, sinon dans le contexte, et aussi en fonction des balises qui ont été déclarées spécifiquement.
On peut demander à calculer id_objet
facilement, mais objet
va nécessiter de passer par une balise renvoyant la valeur de l’objet
. Cette balise n’existant pas par défaut dans SPIP 2.0, il faut en créer une (DEMODYN_OBJET
), ce qui donne :
function balise_DEMODYN($p){
// cle primaire
$_id_objet = $p->boucles[$p->id_boucle]->primary;
return calculer_balise_dynamique(
$p, 'DEMODYN', array('DEMODYN_OBJET', $_id_objet)
);
}
function balise_DEMODYN_OBJET($p) {
$objet = $p->boucles[$p->id_boucle]->id_table;
$p->code = $objet ? objet_type($objet) : "'balise_hors_boucle'";
return $p;
}
function balise_DEMODYN_dyn($objet, $id_objet){
return "Objet : $objet, id_objet : $id_objet";
}