Récupérer objet et id_objet

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){
	$id_boucle = index_boucle($p);
	// on prend nom de la cle primaire de l'objet pour calculer sa valeur
	$_id_objet = champ_sql($p->boucles[$id_boucle]->primary, $p);
	$objet = $p->boucles[$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";
}

Auteur Matthieu Marcillaud Publié le : Mis à jour : 12/03/23

Traductions : English, français, Nederlands