2011-01-25 20 views
7

Sto usando primefaces e la sua DataTable. Alcune colonne sono date o valute. Se provo a filtrare quelli, ci sono comportamenti scomodi. Quando inizio a digitare il filtro funziona fino a quando il primo delimitatore (dot per la data, per esempio, in modo che filtra solo per 11. il carattere successivo lasciare che il tavolo per visualizzare nessuna voce).primefaces JSF filtraggio DataTable emette

E 'possibile applicare una DateConverter?

Ecco il mio codice per ora:

<p:column filterBy="#{cou.startDate}" 
    headerText="#{text['date']}" 
    filterMatchMode="contains" 
    sortBy="#{cou.startDate}" > 
     <h:outputText value="#{cou.startDate}" > 
      <f:convertDateTime pattern="dd.MM.yyyy" /> 
     </h:outputText> 
</p:column> 

risposta

2

Per quanto ne so, non è possibile utilizzare un convertitore per il valore del filtro. Tuttavia, puoi gestirlo nella tua logica bean/service/dao.

Si potrebbe hardcoded tua logica e utilizzare SimpleDateFormat per analizzare il valore se la colonna di filtro corrisponde certo nome come startDate o endDate. Un approccio più generico sarebbe utilizzare la reflection per ottenere la classe associata alla colonna e utilizzare SimpleDateFormat se è Date, DecimalFormat se è un numero e così via.

Naturalmente se si sta moltiplicazione quella query a un database, non sarà in grado di utilizzare l'operatore LIKE. Se stai usando un numero dovrai confrontarlo per l'uguaglianza (lo stesso vale per le date). Se stai cercando cose che sono nella memoria dovrai cambiare un po 'la tua logica. Ma non dovrebbe essere troppo cattivo. Se potessi pubblicare alcuni dei tuoi bean di supporto/codice, suppongo che potrei essere un po 'più utile;)

2

Non esiste ancora un meccanismo di filtro della data già pronto in primefaces, ma esiste la possibilità di filtrare per data usando un filtro personalizzato. Si dovrà definire un'intestazione sfaccettatura per la colonna e l'uso chiamate AJAX per il filtraggio "manuale", ma funziona:

<f:facet name="header">DateRange 
    <div> 
    <p:calendar id="from" value="#{bean.from}" styleClass="calendarFilter"> 
     <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/> 
    </p:calendar> 
    <p:calendar id="to" value="#{bean.to}" styleClass="calendarFilter"> 
     <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/> 
    </p:calendar> 
    </div> 
</f:facet> 
3

Invece di usare direttamente il cou.startDate dal modello, si può invece fare la seguente:

creare una nuova proprietà transitoria nella classe del modello.

@Transient 
private String dateForFilter; 
public String getDateForFilter() { 
return dateForFilter; 
} 
public void setDateForFilter(String dateForFilter) { 
this.dateForFilter = dateForFilter; 
} 

Creare la logica seguente prima di restituire il modello di dati.

public List<Item> getDataModel() { 
    List<Item> lstItem = serviceClass.loadItem(userid); 
    for (Item item : lstItem) { 
     DateFormat dateFormat = null; 
     Date date = item.getDate; 
     dateFormat = new SimpleDateFormat("MM/dd/yyyy kk:mm"); 
     item.setDateForFilter(dateFormat.format(date)); 
    } 

    return lstItem; 
} 

Aggiorna il tuo XHTML per utilizzare la proprietà dateForFilter.

<p:column filterBy="#{item.dateForFilter}"> 
    <f:facet name="header"> 
    Transaction Date 
    </f:facet> 
    <h:outputText value="#{item.dateForFilter}" /> 
</p:column> 

Nota: È possibile utilizzare solo questo se non si sta usando la data per aggiornare il contenuto della classe del modello.

HTH.

Problemi correlati