=== DEBUT
Rubrique « Jeux et énigmes »
@JLuc [demandait comment, dans une boucle, accéder à un champ variable (dont le nom est reçu dans l'environnement) de l'objet courant ?->https://discuter.spip.net/t/contourne-acceder-a-un-champ-de-lobjet-courant/174172]
C’est un besoin rare, mais pas totalement inimaginable… Or, la balise [#CHAMP_SQL -> https://www.spip.net/fr_article4041.html]
, qu’on pourrait penser prévue pour, permet d’accéder à la valeur d’un champ, mais « c’est obligatoirement une constante qui doit servir de paramètre ».
@Marcimat a répondu et proposé cette solution, avec la création d’une balise #INFO_CHAMP
:
<BOUCLE_a(ARTICLES){par hasard}{0,1}>
id: #ID_ARTICLE<br />
titre: #TITRE<br />
info #ENV{champ}: #INFO_CHAMP{article,#ID_ARTICLE,#ENV{champ}}<br />
<hr />
</BOUCLE_a>
function balise_INFO_CHAMP($p) {
$type_objet = interprete_argument_balise(1, $p);
$id_objet = interprete_argument_balise(2, $p);
$champ = interprete_argument_balise(3, $p);
if (!$type_objet || !$id_objet || !$champ) {
$msg = _T('zbug_balise_sans_argument', ['balise' => ' ' . zbug_presenter_champ($p)]);
erreur_squelette($msg, $p);
$p->interdire_scripts = true;
return $p;
}
$_params = '[';
$nb_params = is_countable($p->param[0]) ? count($p->param[0]) : 0; // 1ère valeur vide donc 1 en plus
for ($i = 4; $i < $nb_params; $i++) {
$_params .= interprete_argument_balise($i, $p) . ',';
}
$_params .= ']';
$p->code = "generer_objet_info($id_objet, $type_objet, $champ, " . ($p->etoile ? _q($p->etoile) : "''") . ", $_params)";
$p->interdire_scripts = true;
return $p;
}
À noter donc que le calcul de #INFO_CHAMP
nécessite une requête SQL (tout comme la balise [#INFO_xx -> https://www.spip.net/5544]
).