[Résolu] Problème pour trier les valeurs d'un champ extra dans un select

Bonjour,

Depuis plusieurs jours, j’essaie de trier les valeurs d’un <select> qui va me chercher les données d’un champs extra associé aux articles et qui a la caractéristique de pouvoir être une sélection multiple.

Dans ma boucle ci-dessous, je paramètre bien le critère de tri, qui fonctionne à la nuance près que dans les cas où j’ai plusieurs valeurs associées à un article, cela va fausser le tri souhaité. Ma boucle + quelques illustrations ci-dessous pour mieux expliquer ce qu’il se passe.

Ma boucle :

<BOUCLE_test_tri(ARTICLES){0,1}>
<label for="selection">Support</label>
<select name="support" id="selection">
	<option value="">Sélectionner un support</option>
	<BOUCLE_selec_m(ARTICLES){type_contenu=9}{fusion (support)}{par support}>
	<BOUCLE_selec_f(DATA){source tableau,  #LISTER_VALEURS**{support}}>
	[<option VALUE="[(#CLE)]"[(#ENV{support}|=={[(#CLE)]}|?{'selected="selected"',''})]>(#CLE|unique) - #ID_ARTICLE</option>]
	</BOUCLE_selec_f>
	</BOUCLE_selec_m>
</select>
</BOUCLE_test_tri>

Cela me donne donc ceci :

La visualisation par requête SQL me fait comprendre la logique du tri justement faussée par les cas de sélections multiples dans certains articles :
Image2

Pour m’en sortir, je me dis qu’il faudrait que j’enregistre mes données à trier dans un tableau pour sortir de la logique de tri de la table « spip_articles » (sans trop savoir comment pourvoir le réintégrer ensuite dans mon select :sweat_smile:), mais le résultat reste sensiblement le même je ne trouve pas de façon de trier le tableau sur la base de la première colonne… (hors paramètre de boucle qui me ramène à la table « spip_articles »).

Bout de code pour le tableau :

<BOUCLE_fool(ARTICLES){type_contenu=9}{par support}>
<BOUCLE_gool(DATA){source tableau,  #LISTER_VALEURS**{support}}>
[(#ARRAY{#CLE,#VALEUR}|foreach|unique)]
</BOUCLE_gool>
</BOUCLE_fool>

Ce qui me donne :
Image3

Si une âme charitable a une idée, je suis preneur :innocent:.

Je sais pas bien ce que tu veux faire … mais à mon avis il faut commencer par changer <BOUCLE_fool(ARTICLES){type_contenu=9}{par support}> car c’est là que tu fais le tri principal. Ça les trie par support certes mais ça trie les articles quand même… et ta 2eme boucle imbriquée est contrainte par ce premier tri.

Il y a peut être une solution élégante, mais sinon il est souvent assez simple de tout rassembler en vrac dans un #ARRAY au moyen de 1 ou plusieurs boucles basiques, et ensuite, à part et sans imbrication, afficher ce tableau trié comme tu veux pour construire ton SELECT comme tu veux.

Voici 2 contribs sur des sujets plus ou moins en rapport :

1 « J'aime »

Bon, il te faut d’abord récupérer la liste de tes différents supports & supports multiples.
Approximativement c’est quelque chose comme cela en SPIP (je n’ai pas testé).

Cela dit il peut aussi être plus lisible de passer par une fonction php dédiée pour faire le array_merge.

#SET{supports,#LISTE}
<BOUCLE_selec_m(ARTICLES){type_contenu=9}{fusion (support)}{par support}>
[(#SET{supports,#GET{supports}|array_merge{#LISTER_VALEURS**{support}}})]
</BOUCLE_selec_m>

<BOUCLE_supports(DATA){source tableau, #GET{supports}}{par valeur}>
- #CLE -> #VALEUR<br />
</BOUCLE_supports>
1 « J'aime »

Merci beaucoup à vous deux pour votre aide !

J’ai mis en œuvre la solution proposée par Matthieu et ça fonctionne parfaitement ! Cela me permet d’obtenir exactement le résultat souhaité, c’est parfait.

Encore mille mercis pour votre aide précieuse ! :smiley: