Boucle : tester égalité d'un champs extras selon sa valeur au lieu de sa clé

Bonjour,

Dans une boucle, je souhaite afficher les articles selon l’égalité d’une sélection avec la valeur d’un champs extra (que j’ai nommé type_contenu). Seulement je ne vois pas comment faire malgré mes recherches et essais…

Voici comment est fait mon champs extra :

<BOUCLE_test_1 (ARTICLES) {0,1}>
#SET{tableau,#LISTER_CHOIX**{type_contenu}}
[(#GET{tableau}|foreach)]
</BOUCLE_test_1>

1=> lalalala
2=> prprprpr
3=> clclclclcl
4=> nenenenen
5=> dodododod
6=> fufufufufu
7=> gegegegeg
etc.

Admettons, j’ai la variable ci-dessous qui me donne « nenenenen »

#GET{variable}

Je n’arrive pas dans ma boucle a tester le champs extra selon la valeur. Je n’arrive pas plus à convertir la valeur en clé…

Ma boucle en question :

<BOUCLE_liste_articles_branche (ARTICLES){id_rubrique}{branche}{type_contenu ?== #GET{variable}}>

Alors que si je mets à la main la bonne clé, cela fonctionne, sauf que ma variable est issue d’une liste déroulante, donc pas fixe…

<BOUCLE_liste_articles_branche (ARTICLES){id_rubrique}{branche}{type_contenu = 4}>

Merci par avance pour vos éventuelles pistes.

Je crois bien que ce que tu cherches se nomme #LISTER_VALEURS cf Champs extras — utilisation dans les squelettes - SPIP-Contrib :wink:

1 « J'aime »

Merci b_b pour la suggestion.

Si c’est la solution, alors je ne vois malheureusement pas comment l’intégrer dans la construction de ma boucle. Désolé pour mon piètre niveau de connaissance…

J’ai essayé ça, mais cela ne me renvoie aucun résultat. Que j’ai sélectionné ou non quelque chose dans ma liste déroulante.

<BOUCLE_liste_articles_branche (ARTICLES){id_rubrique}{branche}{#LISTER_VALEURS{type_contenu} ?== #GET{variable}}>

Je pense que le plus simple et le plus efficace serait de créer une variable qui me retournerait la clé de mon champs extra « type_contenu » par correspondance de valeur puisque dans la boucle, si je teste sur « type_contenu », spip s’attend à une clé si j’ai bien compris. Seulement je ne vois pas comment faire ça…

Mais pourquoi t’a variable, issu d’un select si j’ai bien compris, te donne la valeur et pas la clé ? Si c’est toi qui construit le select, tu dois pouvoir choisir ce que tu envoie, donc la clé…

Mais [(#LISTER_CHOIX**{type_contenu}|array_flip|table_valeur{#GET{valeur}})] te retournera la clé correspondant à la valeur

1 « J'aime »

Merci beaucoup maieul pour l’aide.

C’est une très bonne question concernant la variable dans le select :wink:. C’est certainement dû à mon manque de connaissance :sweat_smile: .

En effet, à l’origine, j’avais ce très beau select qui me renvoyait bien une clé :

<BOUCLE_actu_controleur(ARTICLES){0,1}>
[(#SAISIE{selection, type_contenu, label=‹ Contenu ›, option_intro=‹ TOUT ›, datas=[(#LISTER_CHOIX**{type_contenu})]})]
<:bouton_filtrer:>
</BOUCLE_actu_controleur>

Ça fonctionnait bien, mais (il y en a toujours un), ça me listait toutes les valeurs de ce champs_extra. Comme celui-ci comprend un très grand nombre de valeurs, je voulais rendre plus agréable
la navigation en limitant l’affichage des valeurs qui apparaissent uniquement dans les articles de la rubrique dans laquelle je me trouve. Et ça je n’arrive pas à le faire sur cette base… Si c’est possible, je suis preneur !

J’ai bien essayé des variantes en ajoutant tout ou partie des critères supplémentaire dans la boucle et en essayant également avec #LISTER_VALEURS au lieu de #LISTER_CHOIX, mais rien n’y a fait… :
<BOUCLE_actu_controleur(ARTICLES){id_rubrique}{branche}{fusion (type_contenu)}>

Du coup je me suis rabattu sur un select sous cette forme là, qui me renvoi la valeur plutôt que la clé… Mais au moins, j’arrive à limiter les valeurs du select aux valeurs du champs extra qui apparaissent dans les articles de la rubrique dans laquelle je me trouve.

Mais peut-être qu’il est possible de récupérer la clé plutôt que la variable dans ce sélect, mais je n’ai pas trouvé comment faire…

<form action="#SELF" method="post" id="consulter_actus">
<BOUCLE_actu_controleur(ARTICLES){id_rubrique}{0,1}>		
<select name="contenu_art" id="contenu_select">
<option value="">Sélectionner un contenu</option>
<BOUCLE_contenu_art(ARTICLES){id_rubrique}{branche}{par num titre}{fusion (type_contenu)}>
<option VALUE="[(#LISTER_VALEURS{type_contenu})]"[(#ENV{contenu_art}|=={[(#LISTER_VALEURS{type_contenu})]}|?{' selected="selected"',''})]>[(#LISTER_VALEURS{type_contenu})]</option>
</BOUCLE_contenu_art>
</select>			
<button type='submit' class='button small' type='submit'><:bouton_filtrer:></button>
</BOUCLE_actu_controleur>
</form>

Grâce à la ligne de code de maieul, j’arrive à récupérer la clé qui correspond à la valeur dans mon select en l’adaptant comme ceci (le #GET ne fonctionnait pas alors je l’ai remplacé en testant par un #ENV et ça fonctionne) :

[(#LISTER_CHOIX**{type_contenu}|array_flip|table_valeur{#ENV{contenu_art}}|set{ma_cle})]

J’ai placé ce bout de code dans la boucle ou se trouve le select. Pas très sûr de mon coup donc ne pas hésiter à me dire si je fais fausse route.

Dans le corps du squelette de la rubrique, j’arrive à afficher la clé via : #GET{ma_cle}

Par contre, je dois vraiment être bête, mais impossible de parvenir à mes fins dans la boucle qui me permet d’afficher mes articles dans un tableau selon la clé sélectionnée dans mon select…

Il me semblait que la bonne syntaxe aurait été la suivante :

<BOUCLE_liste_articles_branche (ARTICLES){id_rubrique}{branche}{par num titre}{type_contenu ?= #GET{ma_cle}}>
Ici le code qui affiche mon tableau
</BOUCLE_liste_articles_branche>

Mais peu importe ce que je sélectionne, ça ne change rien à mon tableau.

Si je remplace le {type_contenu ?= #GET{ma_cle}} par {type_contenu == #GET{ma_cle}}, ça fonctionne un peu mieux car ça m’affiche dans le tableau tous les articles qui contiennent la clé du champs_extra. Admettons que je sélectionne la valeur dont la clé est « 3 », cela m’affichera bien les articles avec cette clé, mais également ceux qui contiennent un 3, à savoir : « 13 », « 23 », tous les « 30 », etc.

Quant à {type_contenu ?== #GET{ma_cle}} , cela ne me donne rein de mieux que {type_contenu ?= #GET{ma_cle}}.

Je ne vois vraiment pas ce qui ne fonctionne pas. Peut-être que ma clé, telle que je la récupère, n’a pas le bon format (int, char, ou que sais-je ?)…

Alleluia ! J’ai enfin trouvé une solution. Je la trouve bien tarabiscotée mais je la mentionne ici des fois que ça servirait à quelqu’un.

Déjà, je ne comprends pas pourquoi {type_contenu ?= #GET{ma_cle}} ne me donne pas le résultat attendu. A savoir : « si la variable ma_cle existe, teste moi la stricte égalité du paramètre avec la variable déclarée ».

Du coup j’ai du faire 12 milliards de tentatives empirique pour arriver à mes fins. J’obtiens donc les bons résultats en déclarant la variable suivante :

#SET{regex, #GET{ma_cle}|?{#VAL{"^"}|concat{#GET{ma_cle},"$"}, ""}}

En langage compréhensible je crois que ça veut dire :
Je créé une variable regex:

  • si ma_cle existe alors je colle ^ au début de ma variable et $ à la fin de ma variable (ce sont des astuces d’expressions régulières pour dire qu’il n’y a rien avant et après ma variable),
  • si ma_cle n’existe pas, alors ma variable regex est vide.

Et enfin, dans mon tableau dynamique, j’intègre dans la boucle, le paramètre suivant :

<BOUCLE_liste_articles_branche (ARTICLES){id_rubrique}{branche}{par num titre}{type_contenu == #GET{regex}}>
Ici le code qui affiche mon tableau
</BOUCLE_liste_articles_branche>

je ne comprends pas pourquoi {type_contenu ?= #GET{ma_cle}} ne me donne pas le résultat attendu. A savoir : « si la variable ma_cle existe, teste moi la stricte égalité du paramètre avec la variable déclarée ».

Cette syntaxe n’existe pas. Regarde la doc sur spip.net.
Ce qui existe ne concerne que #ENV et pas #GET, et nécessite que le champ à gauche ait le même nom que l’argument de #ENV à droite.

Pour le reste tant mieux que tu aies trouvé. Pour des textes complexes, il est parfois plus simple de construire l’argument d’un critère « where ».

Merci JLuc pour le retour.

Pourtant j’avais bien lu la page Critères optionnels avec opérateurs mais j’avais du mal à distinguer les opérateurs restrictifs à ce cas de figure et les autres…

Je prends bonne note de la piste where.

Et c’est une des raisons qui rend utile l’utilisation du filtre |setenv |setenv - SPIP :slight_smile: