Primefaces datatable date filtre de gamme avec filterFunction
- Je utiliser filterFunction méthode de datatable sur primefaces 5.0. Je veux filtre anniversaire par plage de date sur l'en-tête de colonne.
Sur le navigateur internet de la console je reçois cette erreur:
<?xml version="1.0"
encoding="utf-8"?><partial-response><error><error-name>java.lang.ClassCastException</error-name><error-message><![CDATA[javax.faces.component.UIPanel
cannot be cast to
javax.faces.component.ValueHolder]]></error-message></error></partial-response>
Datatable :
<p:dataTable var="person" value="#{testDateRange.persons}"
id="personTable" paginator="true" styleClass="customTableStyle" editable="true"
rows="10" resizableColumns="true"
emptyMessage="No persons"
filteredValue="#{testDateRange.filteredPersons}"
widgetVar="dateRangeWidget" >
<p:column id="nameId" filterBy="name" sortBy="name" filterMatchMode="contains" headerText="Name">
<h:outputText value="#{person.name}" />
</p:column>
<p:column id="birthdayId" headerText="birthday" filterBy="birthday" filterFunction="#{testDateRange.filterByDate}">
<f:facet name="filter">
<p:calendar id="from" value="#{testDateRange.dateFrom}" styleClass="customCalendar" pattern="dd/MM/yyyy">
<p:ajax event="dateSelect" oncomplete="PF('dateRangeWidget').filter()" update="personTable"/>
</p:calendar>
<p:calendar id="to" value="#{testDateRange.dateTo}" styleClass="customCalendar" pattern="dd/MM/yyyy">
<p:ajax event="dateSelect" oncomplete="PF('dateRangeWidget').filter()" update="personTable"/>
</p:calendar>
</f:facet>
<h:outputText value="#{person.birthday}" >
<f:convertDateTime pattern="dd/MM/yyyy"/>
</h:outputText>
</p:column>
</p:dataTable>
Bean:
@Component("testDateRange")
@Scope("session")
public class TestDateRangeBean {
private List<Person> persons;
List<Person> filteredPersons;
private Date dateFrom;
private Date dateTo;
public TestDateRangeBean() {
persons = new ArrayList<>(Arrays.asList(
new Person("John", new Date(1357016400000L)),
new Person("Will",new Date(1357102800000L)),
new Person("Peter",new Date(1414900800000L)),
new Person("Cris", new Date(1438747200000L)),
new Person("Cemil", new Date(1436068800000L))
));
}
public boolean filterByDate(Object value, Object filter, Locale locale) {
//it fails before calling this method
String filterText = (filter == null) ? null : filter.toString().trim();
if(StringUtils.isEmpty(filterText)) {
return true;
}
if(value == null) {
return false;
}
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date filterDate;
try {
filterDate = df.parse(filterText);
} catch (ParseException e) {
return false;
}
return filterDate.after(dateFrom) && filterDate.before(dateTo);
}
//all the getters and setters
Et j'ai un simple POJO Personne de la classe qui ne contient que " nom " et "date de naissance".
Comment puis-je filtrer les ans à la date j'ai entrer sur l'en-tête de colonne. Je vois que c'est de la UIPanel composant au lieu de dates de valeurs. (Je suppose qu'il s'attend à un élément avec une valeur, et quand il en trouve deux composants, il renvoie le composant conteneur lui-même, suis-je le droit?)
Grâce
OriginalL'auteur zekifh | 2014-05-21
Vous devez vous connecter pour publier un commentaire.
Solution avancée:
JSF:
Filtre Bean:
OriginalL'auteur Stephan
Si vous ne voulez pas de la tromperie avec le champ caché, plus les avantages de la réutilisation de ces filtres envisager la rédaction d'un composant composite dont le type de composant extends javax.des visages.composante.UIInput. Primefaces s'attend à ce que le filtre soit un sous-type de javax.des visages.composante.ValueHolder.
C'est la façon dont le composant composite pourrait ressembler.
Avis
componentType="dateRange"
dans lecc:interface
tag. Il fait référence à la racine de la classe du composant de ce composite composant. Qui est aussi simple que.La valeur que le composite component suffit d'une simple POJO.
Après tout que l'utilisation est très simple.
Également remarquer le filtre personnalisé fonction. Whis est aussi simple que
Le tout ressemble à ceci.
<clx:dateRange
mais d'où vient leclx
préfixe venir?c'est ia choisi au hasard de l'espace de noms dans ce cas
xmlns:clx="http://xmlns.jcp.org/jsf/composite/clxcomponents"
. Pour une introduction rapide sur la façon de travailler avec des éléments composites, vous pouvez lire ce blogSuggéré composant fonctionne très bien, merci. Le problème dans mon cas est que, bien que
dateRange
est sous-type deValueHolder
, la valeur n'est pas envoyé au filtre. Quand je change le type de la valeur à la chaîne, il fonctionne. Comment puis-je envoyer dateRange valeur pour le filtre?Salut Surpris De Noix De Coco. Merci pour votre contribution. J'ai essayé d'utiliser ce composant sur un datatable avec le chargement paresseux, mais je ne sais pas comment traiter avec la valeur de l'attribut. Savez-vous comment je peux récupérer l'objet sélectionné sur le filtre de la carte à la méthode de chargement ?
Comme j'ai utilisé un filtre sans filterFunction, j'ai dû remplacer getLocalValue de retourner une instance de DateRange lors de la super.getLocalValue() est nulle.
OriginalL'auteur Surprised Coconut
Rencontré le même problème mais dans mon cas c'était le bouton de filtre à facette pour afficher le panneau de recouvrement avec le curseur de plage à l'intérieur.
Résoudre à utiliser l'en-tête de la facette de la place:
Aussi il n'est pas nécessaire dans la mise à jour de l'attribut p:composants ajax.
<h:inputHidden>
dans le filtre, je reçoisjava.lang.ClassCastException: javax.faces.component.UIPanel cannot be cast to javax.faces.component.ValueHolder
et le filtre ne fonctionne pas. Je suppose que h:inputHidden ne peut pas être dans le filtre.Bon, le problème était dans le commentaire. Il doit être retiré ou mis en supprimer la balise:
<ui:remove><!-- to hide default filter input --></ui:remove>
.OriginalL'auteur alexSunder
C'est juste Java 8 de la mise en œuvre de Stephan @réponse, à l'aide de java.le temps de classe au lieu de la Date.
La JSF section est presque identique à l'exception du modèle de date.
Bean:
OriginalL'auteur PC.