Bonjour,
Comment peut on récupérer dans un xmlService les champs issus d'une liste déroulante à choix multiples d'un formulaire
Merci d'avance
Bonjour,
Comment peut on récupérer dans un xmlService les champs issus d'une liste déroulante à choix multiples d'un formulaire
Merci d'avance
c'est pas possible avec ce type la.
utilise plutot checkbox.
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
La réponse courte :
pas possible, il faut utiliser la technique avancée du pivot.
La réponse longue:
Le Framework XMLCLX ne supporte pas le passage de multiples paramètres HTTP portant le mêmes noms.
Voici la raison :
En exemple, le code html utilisé :
Si l'utilisateur sélectionne l'option 1 et 2, la requete HTTP (en GET ici pour une meilleure compréhension) serait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <select name="test" mode="multiple"> <option value="1">...</option> <option value="2">...</option> <option value="3">...</option> </select>
Lorsque le Framework dispatch la requete, il interprète les paramètres et les placent dans le Context, en fonction du nom.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ...?test=1&test=2
Il placera donc le champ test avec la valeur 1 une permiere fois dans le Context. Puis il placera le champ test avec la valeur 2 dans le Context.
Le probleme... C'est que le Context est un tableau hashé qui ne supporte pas 2 champs portant le meme nom... La deuxième valeur écrase donc la première.
Pour s'en sortir, il faut laisser tomber le <SELECT> mode multiple inutilisable et utiliser la technique du Pivot avec une liste de checkbox.
Pour cela, vous construiser votre formulaire comme suit :
Le XMLC_Pivot indique le champ à pivoter. Le nom est à votre guise. Généralement, c'est le node-name sur lequel on travaille (publisher, ORG ou ce que vous voulez).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <form name="..." action="..." post="..."> <input type="hidden" name="XMLC_Pivot" value="OPTION" /> ... <xsl:for-each select="Item"> <input type="checkbox" name="OPTION[{position()}].ITEM_ID" value="{ITEM_ID} /> <xsl:value-of select="ITEM_NAME" /> <xsl:for-each> </form>
Le xsl:for-each peut bien sûr etre remplacé par des templates match. Il permet de matcher sur tous les éléments que vous voulez voir apparaitre dans votre liste. Si vous n'avez pas cette liste dans le XML, à vous de la construire directement en placant correctement les <input type="checkbox">
Ensuite chaque champ porte un nom différent. Dans l'exemple, après construction par le for-each, le premier Item créera un <input type="checkbox" name="OPTION[1].ITEM_ID" value="1001" />
Lorsque vous validerez cette requete, le Framework construira un InputDoc avant l'éxécution du XMLService, qui contiendra la structure suivante :
Vous pourrez y accéder par code, dans le BeforeXMLGRAM ou bien utiliser l'instruction Match dans le XMLGram directement, pour décrire un traitement s'éxécutant pour chaque OPTION. (Voir http://www.xmlrad.com/Manual/Appendix13/index.htm sur le XMLGRAM pour plus d'infos sur match)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <Context> <OPTION> <ITEM_ID>1001</ITEM_ID> <OPTION> ... </Context>
Voila !![]()
Nicolas
OK. Mais j'avais opté pour une combo pour un soucis de place. Avec l'attribut size=1 cela s'intégrait très facilement dans ma page (en fait la combo est utilisé ici pour filtrer les lignes d'une table). Une checkbox m'oblige à modifier l'architecture de ma page ou alors à afficher cette checkbox dans une fenetre popup(?) (les contraintes sont plus importantes : javascript (obligatoire?),xmlservice supplémentaire, moins pratique et moins joli...).
Pour une interface coquette, il serait possible de placer les checkbox dans un div, et d'utiliser du javascript/css pour l'afficher ou pas, avec ou sans scrollbar, etc...
Il serait possible de recréer l'equivalent d'un <select> avec cette technique, mais effectivement, ca necessiterait un peu de html avancé...
La popup n'est généralement pas conseillée, parce qu'on a toutes les chances de retrouver 50 fenetres IE ouvertes sur le bureau des utilisateurs. Les popups sont rarement la bonne solution...
Nicolas
Si tu tiens absolument à utiliser une combobox en mode multiple, il te faudra parcourir le Context à la main. En effet, les valeurs sélectionnées dans ta combobox seront de cette forme :
test=1
test=4
Le Context ne permet pas, comme le dit Nicolas, de stocker plusieurs valeurs pour un champ portant le même nom. Ce sera à toi de parcourir tout le tableau du Context en testant le nom du champ :
Voilàx !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 for I := 0 to Context.Count-1 do begin FieldName := Context.GetName(I); if FieldName = 'test' then begin ... end; end;
A+
Julien C.
nop, comme le context est haché, le nom va donner la meme clé et donc va écraser la valeur précédente., il n'y a pas moyen de retrouver les anciennes valeurs portant le meme nom dans le Context.
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager