Est-ce possible d'afficher (un peu comme pour l'exemple http://struts.improve-technologies.c...de=showAllNews sur le tableau en bas) un détail qui contient une Collection de beans ?
Merci pour toutes vos contributions.
Est-ce possible d'afficher (un peu comme pour l'exemple http://struts.improve-technologies.c...de=showAllNews sur le tableau en bas) un détail qui contient une Collection de beans ?
Merci pour toutes vos contributions.
Je viens d'implémenter un exemple similaire (master/détail comme ils l'appellent sur leur FAQ) pour mieux comprendre mais je ne saisi vraiment pas le principe
ça sert pas à grand chose sinon à afficher le contenu d'une colonne dynamiquement. Ou est le détail dans tout ça ?
Le principe de detail est de limiter le nombre de colonnes de la liste tout en permettant d'en visualiser d'autres.
En gros, on met les colonnes de recherche/tri dans la partie liste et les autres dans detail.
Par exemple, dans une liste de personnes, on pourrait mettre le nom, le prénom, le code postal, la ville dans la liste et afficher le numéro de téléphone, son adresse e-mail etc... dans la partie détail
Ok. C'est un peu plus clair avec l'histoire du tri.
Mais est ce possible d'adapter pour répondre à mon besoin ?
On pourrait imaginer que la collection "listEssai" sur laquelle j'itère contient des beans UneLigne :que la liste "list" contient des DetailedBean:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public class UneLigne{ private String prop1; private String prop2; private ArrayList list; ... }
UneLigne :J'aimerai faire quelque chose comme ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public class DetailedBean{ private String attrib1; private String attrib2; ... }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <layout:collection id="indi" indexId="index" sortAction="client" bundle="labelScreen" emptyKey="page.struts_layout.collection.vide" property="listEssai" name="unForm" styleClass="FORM"> <layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop1" /> <layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop2" /> <layout:collectionDetail property="list" /> </layout:collection> <layout:pagerStatus key="status.pagination" /> </layout:pager> <layout:grid cols="3" styleClass="SEARCHBOX"> <layout:detail key="DETAIL" property="attrib1" styleClass="LABEL"/> </layout:grid>
Je ne crois pas que ça fonctionne, c'est du javascript assez basic derrière, je ne me souviens pas d'avoir vu un traitement pour des listes... mais ça date un peu...
Le plus simple serait d'essayer...
Tout ce que j'arrive à afficher c'est soit "[]" quand c'est une liste soit ça n'affiche rien du tout quand je sors des sentiers battus.Le plus simple serait d'essayer...
Peut-être que tu peux combiner un nestedCollection avec un collectionDetail :
sans grande conviction que ça puisse fonctionner mais à tester quand même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <layout:collection id="indi" indexId="index" sortAction="client" bundle="labelScreen" emptyKey="page.struts_layout.collection.vide" property="listEssai" name="unForm" styleClass="FORM"> <layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop1" /> <layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop2" /> <layout:nestedCollection property="list"> <layout:collectionDetail property="attrib1" /> </layout:nestedCollection> </layout:collection> <layout:pagerStatus key="status.pagination" /> </layout:pager> <layout:grid cols="3" styleClass="SEARCHBOX"> <layout:detail key="DETAIL" property="attrib1" styleClass="LABEL"/> </layout:grid>
Tout ça combiné avec un pager, tu seras vraiment chanceux si ça fonctionne.
ça ne fonctionne pas ou je m'y prend mal.
p.s:nestedCollection necessite un id pour index
Ah oui pardon, j'ai oublié l'attribut id.
Du coup, je doute encore plus que cela puisse fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <layout:collection id="indi" indexId="index" sortAction="client" bundle="labelScreen" emptyKey="page.struts_layout.collection.vide" property="listEssai" name="unForm" styleClass="FORM"> <layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop1" /> <layout:collectionItem sortable="true" title="PROPPRIETE 1" property="prop2" /> <layout:nestedCollection property="list" id="itemList"> <layout:collectionDetail name="itemList" property="attrib1" /> </layout:nestedCollection> </layout:collection> <layout:pagerStatus key="status.pagination" /> </layout:pager> <layout:grid cols="3" styleClass="SEARCHBOX"> <layout:detail key="DETAIL" property="attrib1" styleClass="LABEL"/> </layout:grid>
ça donne quoi de votre côté ?
Chez moi je me prend pas d'exception mais ça prend pas (EL, nestedCollection)
Je pense que si quelqu'un réussi à faire ça en premier ce ne sera sûrement pas moi
Dans tous les cas, ça ne fonctionne pas...
Le javascript associé n'est pas prévu pour cette fonctionnalité, tu auras toujours le dernier élément de la liste dans l'affichage du détail.
Une option serait de faire un getter spécialisé dans ta classe source (celle que représente le tag <layout:collection> pour obtenir la liste des éléments formatés comme il faut... et encore... il reste le problème que par défaut, c'est un champ <input type="text"> qui est associé à l'affichage du détail...
Je te propose ceci (à défaut de mieux) pour exposer une solution
page JSP de test (elle se suffit à elle même)
La modification à apporter dans le fichier javascript.js (de struts-layout)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 <%@ taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%! public class User { private String login; private String description; private List<Role> roles = new ArrayList<Role>(); public User() { super(); } public User(String login, String description) { super(); this.login = login; this.description = description; } public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } public String getListRoles() { StringBuilder sb = new StringBuilder(); sb.append("<ul>"); for (Role role : roles) { sb.append("<li>").append(role.name).append(" - ").append(role.description).append("</li>"); } sb.append("</ul>"); if (sb.length() > 0) return sb.substring(0, sb.length()); return "- aucun -"; } } public class Role { private String name; private String description; public Role(String name, String description) { super(); this.name = name; this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } %> <% List<User> list = new ArrayList<User>(); User user = new User("OBU", "Olivier BUTTERLIN"); List<Role> roles = new ArrayList<Role>(); roles.add(new Role("MANAG","Manager")); roles.add(new Role("USER","Utilisateur")); roles.add(new Role("ADMIN","Administrateur")); roles.add(new Role("COMPTA","Comptabilité")); roles.add(new Role("SECURITY1","Responsable sécurité (niveau 1)")); roles.add(new Role("SECURITY2","Responsable sécurité (niveau 2)")); roles.add(new Role("SECURITY3","Responsable sécurité (niveau 3)")); roles.add(new Role("SECURITY4","Responsable sécurité (niveau 4)")); roles.add(new Role("SECURITY5","Responsable sécurité (niveau 5)")); user.setRoles(roles); list.add(user); user = new User("CNVY", "Cendrine"); roles = new ArrayList<Role>(); roles.add(new Role("ADMIN","Administrateur")); user.setRoles(roles); list.add(user); request.setAttribute("LIST", list); %> <style> <!-- .suppressed{ display:none; } .box{ border-style:solid; border-color:#909090; border-width:1px; vertical-align:top; } --> </style> <layout:html> <form> <layout:grid cols="2" width="800" align="left"> <layout:cell width="200" height="200" align="top" styleClass="box"> <layout:collection name="LIST" id="user" indexId="r" styleClass="box" width="100%"> <layout:collectionItem title="Login" name="user" property="login" /> <layout:collectionItem title="Description" name="user" property="description" /> <layout:collectionDetail name="user" property="listRoles"/> </layout:collection> <layout:detail layout="false" property="listRoles" key="Roles" styleClass="suppressed"/> </layout:cell> <layout:cell align="left" styleClass="box"> <div id="listRoles" style="width:600px;"></div> </layout:cell> <layout:cell colspan="2"> un texte en dessous... </layout:cell> </layout:grid> </form> </layout:html>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 function showDetail(id, line) { // Get the object var object = id[line]; var fields = document.getElementsByTagName("input"); var field; var value; // Update each property for (i in object) { // find the field tag. field = null; for (j in fields) { if (fields[j].type=="text" && fields[j].name==i) { field = fields[j]; break; } } if (field) { value = object[i]; field.value = value; if (document.getElementById(i) != null) { field.style.visibility = "hidden"; document.getElementById(i).innerHTML = value; } else { field.style.visibility = "visible"; } } } }
Je n'ai pas le temps de tester mais comme je te l'ai dit précédemment, je ne suis pas surprise que cela ne fonctionne pas, d'autant plus si le javascript utilisé ne prévoit pas de traiter une liste, comme le signalait OButterlin.
EDIT : grillée
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