Bonjour,
J'essaye depuis un bon moment de faire marcher les sort et filter sur des rich:columns.
Les versions des produits que j'utilise :
- jdk1.5
- Implémentation SUN de JSF, version 1.2
- Richfaces 3.3.1.GA
- JSTL 1.2
- JBoss AS 5.0.1.GA
La version simplifiée de mon problème : je souhaite afficher un tableau présentant les attributs d'objets. J'ai dans mon ActionBean :
- La liste des types d'attributs de mes objets : une Map {attributTypeId -> attributTypeName}
- La liste des objets : ArrayList<HashMap<Long, String>> : un objet étant ici une HashMap<Long, String> qui associe un attributTypeId à une valeur
Un extrait de mon ActionBean :
Le résultat que je souhaite avoir est :
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 public class TestActionBean { private UIDataTable dataTable; // Liste des types d'attributs : une Map {attributTypeId -> attributTypeName} private final HashMap<Long, String> listeTypesAttributs; // Chaque "objet" est une Map {attributTypeid -> attributValue} private final ArrayList<HashMap<Long, String>> listeObjects; // AttributTypeId -> FilterString private final HashMap<Long, String> listeFilterAttributs; // Construteur + getters/setters }
J'arrive à l'obtenir avec 3 <rich:column /> séparées (extrait de ref.jsp : )
Comme je ne connais pas à priori les types d'attributs, je veux pouvoir générer mes colonnes en itérant la liste présente dans mon ActionBean.
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 <h:form id="testForm"> <rich:dataTable binding="#{testActionBean.dataTable}" id="testDataTable" value="#{testActionBean.listeObjects}" var="object"> <rich:column filterBy="#{object[1]}" sortBy="#{object[1]}"> <f:facet name="header"> <h:outputText value="#{testActionBean.listeTypesAttributs[1]}" /> </f:facet> <h:outputText value="#{object[1]}" /> </rich:column> <rich:column ... avec 2/> <rich:column ... avec 3/> </rich:dataTable> </h:form>
1ère tentative, j'ai essayé avec des <rich:columns /> (extrait de test_columns_1.jsp) :
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 <h:form id="testForm"> <rich:dataTable binding="#{testActionBean.dataTable}" id="testDataTable" value="#{testActionBean.listeObjects}" var="object"> <rich:columns value="#{testActionBean.listeTypesAttributs}" var="attribType" sortBy="#{object[attribType.key]}" filterBy="#{object[attribType.key]}"> <f:facet name="header"> <h:outputText value="#{attribType.value}" /> </f:facet> <h:outputText value="#{object[attribType.key]}" /> </rich:columns> </rich:dataTable> </h:form>
L'affichage de mes objets est Ok. Par contre, le sort ne marche pas (rien ne se passe quand je clic sur le header, je vois bien la requête ajax partir, aucune exception dans mes traces). Et pour le filter, je n'ai tout simplement pas les inputs.
2ème tentative, j'ai essayé de faire un filter à la main avec des inputs et filterExpression (extrait de test_columns_2.jsp) :
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 <h:form id="testForm"> <rich:dataTable binding="#{testActionBean.dataTable}" id="testDataTable" value="#{testActionBean.listeObjects}" var="object"> <rich:columns value="#{testActionBean.listeTypesAttributs}" var="attribType" sortBy="#{object[attribType.key]}" filterExpression="#{fn:startsWith(object[attribType.key], testActionBean.listeFilterAttributs[attribType.key])}"> <f:facet name="header"> <h:panelGroup> <h:outputText value="#{attribType.value}" /> <h:inputText value="#{testActionBean.listeFilterAttributs[attribType.key]}" onclick="Event.stop(event);"> <a4j:support event="onkeyup" ignoreDupResponses="true" requestDelay="700" reRender="testDataTable" /> </h:inputText> </h:panelGroup> </f:facet> <h:outputText value="#{object[attribType.key]}" /> <h:outputText escape="false" value="<br/>filterString : #{testActionBean.listeFilterAttributs[attribType.key]}" /> <h:outputText escape="false" value="<br/>filterTest : #{fn:startsWith(object[attribType.key], testActionBean.listeFilterAttributs[attribType.key])}" /> </rich:columns> </rich:dataTable> </h:form>
L'affichage est Ok, le sort ne réagit toujours pas. Quand je tape dans mes inputs, j'ai bien la valeur qui est prise en compte, le rerender se fait, mon outputText filterTest m'indique bien si la valeur valide le test ou non (true/false), mais toutes les lignes restent en place.
J'ai testé en initialisant la listeFilterAttributs dans mon ActionBean avec des String "toto", dans ce cas, aucune ligne s'affiche (aucun de mes attributs ne contiennent "toto", c'est normal, donc la filterExpression marche bien).
3ème tentative, j'ai essayé d'utiliser un forEach JSTL pour générer des <rich:column /> (extrait de test_foreach_1.jsp) :
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 <h:form id="testForm"> <rich:dataTable binding="#{testActionBean.dataTable}" id="testDataTable" value="#{testActionBean.listeObjects}" var="object"> <c:forEach items="#{testActionBean.listeTypesAttributs}" var="attribType"> <rich:column sortBy="#{object[attribType.key]}" filterBy="#{object[attribType.key]}"> <f:facet name="header"> <h:outputText value="#{attribType.value}" /> </f:facet> <h:outputText value="#{object[attribType.key]}" /> </rich:column> </c:forEach> </rich:dataTable> </h:form>
L'affichage est Ok, le sort fonctionne. Par contre, tous mes inputs de filters filtrent mon dernier attribut. Un problème de composant sans id ?
4ème tentative, j'ai aussi essayé avec un filter maison (extrait de test_foreach_2.jsp) :
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 <h:form id="testForm"> <rich:dataTable binding="#{testActionBean.dataTable}" id="testDataTable" value="#{testActionBean.listeObjects}" var="object"> <c:forEach items="#{testActionBean.listeTypesAttributs}" var="attribType"> <rich:column sortBy="#{object[attribType.key]}" filterExpression="#{fn:startsWith(object[attribType.key], testActionBean.listeFilterAttributs[attribType.key])}"> <f:facet name="header"> <h:panelGroup> <h:outputText value="#{attribType.value}" /> <h:inputText value="#{testActionBean.listeFilterAttributs[attribType.key]}" onclick="Event.stop(event);"> <a4j:support event="onkeyup" ignoreDupResponses="true" requestDelay="700" reRender="testDataTable" /> </h:inputText> </h:panelGroup> </f:facet> <h:outputText value="#{object[attribType.key]}" /> <h:outputText escape="false" value="<br/>filterString : #{testActionBean.listeFilterAttributs[attribType.key]}" /> <h:outputText escape="false" value="<br/>filterTest : #{fn:startsWith(object[attribType.key], testActionBean.listeFilterAttributs[attribType.key])}" /> </rich:column> </c:forEach> </rich:dataTable> </h:form>
Mais j'ai le même problème de filterExpression qui n'est pas prise dynamiquement (cf test_columns_2.jsp).
Si les extraits que j'ai postés ne sont pas suffisants, toutes les sources sont dispo ici
Désolé si mon message est long, mais j'ai voulu être le plus complet possible.
Merci d'avance si vous avez des idées.
Partager