IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

[Richfaces] columns avec sort et filter


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut [Richfaces] columns avec sort et filter
    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 :
    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
    }
    Le résultat que je souhaite avoir est :


    J'arrive à l'obtenir avec 3 <rich:column /> séparées (extrait de ref.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">
     
    		<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>
    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.
    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.

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu as regardé l'exemple de richfaces.?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    J'ai regardé cet exemple.

    J'ai pas réussi à voir à quoi correspond "dataTableStateHolder". A part cet attribut, j'ai repris le même principe dans ma 1ère tentative sans succès.

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    c'est juste une classe pour définir les maps:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private Map<String, SortOrder> sortOrders = new HashMap<String, SortOrder>();
     
    private Map<String, Object> columnFilterValues = new HashMap<String, Object>();

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    J'ai du mal à voir comment l'utiliser. C'est ça qui expliquerait pourquoi ma tentative 1 ne fonctionne pas ?

    En théorie, sortBy et filterBy sont pas suffisants ?

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Je cherche aussi cette solution mais sur l'exemple que tu as donné je ne parviens pas à le reproduire

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu n'utilise pas un dataModel comme dans la démo, et tu utilise un binding, regarde bien cet exemple, le filtre et le tri fonctionnent bien, il n'y a pas de raison pour que ça ne marche pas pour toi.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    Dans l'exemple avec le dataModel, il y a plein de choses que je ne comprends pas (que je n'ai pas cherché à comprendre en fait ...).

    Avant d'arriver sur un exemple aussi complexe, j'ai plutôt creusé l'exemple de columns. Et dans celui-là, aucun dataModel, juste un tag de sort.

    J'essaierai de mettre l'exemple avec dataModel en pratique, mais j'ai l'impression de sortir une arme de guerre pour un truc qui me parait être fait avec 2 attributs sur un tag ...

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par Neraud Voir le message
    Dans l'exemple avec le dataModel, il y a plein de choses que je ne comprends pas (que je n'ai pas cherché à comprendre en fait ...).

    Avant d'arriver sur un exemple aussi complexe, j'ai plutôt creusé l'exemple de columns. Et dans celui-là, aucun dataModel, juste un tag de sort.

    J'essaierai de mettre l'exemple avec dataModel en pratique, mais j'ai l'impression de sortir une arme de guerre pour un truc qui me parait être fait avec 2 attributs sur un tag ...
    il semble que tu n'a pas essayé non plus à comprendre le deuxième exemple plus simple ...

    quel est le type des objets de la liste : listeTypesAttributs?
    comment tu les initialisent?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Par défaut
    Les extraits de mes sources sont sur le premier post (avec les liens pour télécharger les versions complètes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // 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;
    Et je les remplis "en dur" dans le constructeur de mon Bean :

    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
    listeTypesAttributs = new HashMap<Long, String>();
    listeTypesAttributs.put(new Long(1), "Attribut_1");
    listeTypesAttributs.put(new Long(2), "Attribut_2");
    listeTypesAttributs.put(new Long(3), "Attribut_3");
     
     
    listeObjects = new ArrayList<HashMap<Long, String>>();
     
    final HashMap<Long, String> object1 = new HashMap<Long, String>();
    object1.put(new Long(1), "Objet_1_Val_1");
    object1.put(new Long(2), "Objet_1_Val_2");
    object1.put(new Long(3), "Objet_1_Val_3");
    listeObjects.add(object1);
     
    final HashMap<Long, String> object2 = new HashMap<Long, String>();
    object2.put(new Long(1), "Objet_2_Val_1");
    object2.put(new Long(2), "Objet_2_Val_2");
    object2.put(new Long(3), "Objet_2_Val_3");
    listeObjects.add(object2);
     
    final HashMap<Long, String> object3 = new HashMap<Long, String>();
    object3.put(new Long(1), "Objet_3_Val_1");
    object3.put(new Long(2), "Objet_3_Val_2");
    object3.put(new Long(3), "Objet_3_Val_3");
    listeObjects.add(object3);
    Par rapport à l'exemple, je n'ai pas de sortOrder. Donc j'ai rajouté dans mon bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // AttributTypeId -> SortOrder
    private HashMap<Long, Ordering> listeSortOrder;
    Rempli en dur également :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    listeSortOrder = new HashMap<Long, Ordering>();
    for (Long attribTypeId : listeTypesAttributs.keySet()) {
    	listeSortOrder.put(attribTypeId, Ordering.UNSORTED);
    }

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    et pourquoi tu utilise des maps? c'est tiré de l'exemple, la valeur de dataTable est une liste d'objets de type String dans ton cas, pas HashMap.

Discussions similaires

  1. Problème avec Sort() sur un TList
    Par ViNzZz dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2006, 14h45
  2. Probleme avec Sort ListCtrl
    Par beb30 dans le forum MFC
    Réponses: 6
    Dernier message: 06/06/2006, 16h08
  3. Est-ce possible avec sort ??
    Par LE NEINDRE dans le forum Langage
    Réponses: 1
    Dernier message: 22/12/2005, 17h59
  4. [debutante][list] trier avec sort()
    Par norkius dans le forum Débuter
    Réponses: 10
    Dernier message: 24/10/2005, 18h13
  5. Pb de tri avec "sort"
    Par blueice dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2005, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo