Het object en diens id ophalen

Dit artikel toont hoe het objecttype en diens identificatie in een lus kunnen worden bepaald, zodat ze kunnen worden gebruikt in de berekeningen van een baken.

Statische bakens

Met de parameters voor het baken $p, is het vrij eenvoudig om object en id_object te vinden:

function balise_DEMO($p){
	// neem de naam van de primaire sleutel van het object om diens waarde te berekenen
	$_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 "Object : $objet, id_object : $id_objet";
}

Merk op dat er twee functies zijn. De eerste gebruikt de omschrijving van het baken om de naam van de omhullende lus en de naam van de primaire sleutel te vinden, en vraagt de waarde van die primaire sleutel met functie champ_sql(). Let op: wat wordt opgehaald in variabele $id_object is een code die moet worden geëvalueerd het PHP (het is niet langer een numerieke waarde).

Zodra deze parameters zijn opgehaald, voegen we een PHP-code toe die moet worden geëvalueerd in de code die door de template compilatie wordt gegenereerd (deze code wordt in het cachegeheugen opgeslagen). Dit is wat wordt toegevoegd in $p->code. Die code wordt vervolgens geëvalueerd tijdens het maken van de zogenaamde pagina cache.

De calculer_balise_DEMO() functie wordt dan doorgegeven aan de twee gewenste argumenten en geeft een tekst terug die ze op de pagina weergeeft.

<BOUCLE_a(ARTICLES){0,2}>
	#DEMO<br />
</BOUCLE_a>
	<hr />
<BOUCLE_r(RUBRIQUES){0,2}>
	#DEMO<br />
</BOUCLE_r>

Dit skelet maakt het vervolgens mogelijk om het resultaat te zien, het baken #DEMO ontvangt de verschillende gegevens, afhankelijk van de context waarin deze zich bevindt:

Object: article, id_object: 128
Object: article, id_object: 7
----
Object: rubrique, id_object: 1
Object: rubrique, id_object: 2

Dynamische bakens

Voor een dynamisch baken verhindert de werking ervan zelfs het eenvoudig opvragen van het type en de identificatie van de lus waarin het is geschreven.

Zelfs als het nodig is, bijvoorbeeld bij het maken van CVT-formulieren die hun processen wijzigen afhankelijk van het type lus, is het noodzakelijk om het objecttype en de huidige lus-identificatie door te geven aan de functie _dyn() (en dus aan de verschillende CVT functies).

De aanroep naarcalculer_balise_dynamique() maakt het mogelijk om de compilatiecontextelementen op te halen. Als we vragen om ’id_article’ op te halen, zullen we er zeker een krijgen binnen een lus ARTICLES, maar niet in een lus RUBRIQUES. Om meer specifiek te zijn, wanneer we een ’id_article’ waarde opvragen, gedraagt SPIP zich alsof het het resultaat van een #ID_ARTICLE baken opvraagt, dus zoekt het dan naar de waarde in de dichtstbijzijnde lus, anders kijkt het in de context, en is het ook afhankelijk van de bakens die specifiek zijn gedeclareerd.

We kunnen de berekening van id_object vrij eenvoudig opvragen, maar object vereist een baken dat de object waarde teruggeeft. Dit baken bestaat niet standaard, dus moet het met een (DEMODYN_OBJET) worden gemaakt, wat resulteert in:

function balise_DEMODYN($p){
	// primaire sleutel
	$_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 "Object: $objet, id_object: $id_objet";
}

Auteur hanjo Gepubliceerd op: Aangepast: 12/03/23

Vertalingen: English, français, Nederlands