2013-11-24 102 views
1

因爲PrimeFaces還不支持轉換器<p:dataTable>過濾器,我想實現我自己的自定義過濾器<p:calendar>(當然,這個濾波器的設計看起來還是有點醜陋的IT需求。申請適當的CSS,我不能)。自定義過濾器和轉換器,號碼:dataTable中

<p:column id="discountStartDate" sortBy="#{row.discountStartDate}" style="width:140px;"> 
    <f:facet name="header"> 
     Start Date<br/> 

     <p:calendar id="startDateFilter" converter="#{dateTimeConverter}" 
        timeZone="Asia/Kolkata" locale="#{localeBean.locale}" 
        pattern="dd-MMM-yyyy hh:mm:ss a" 
        readonly="#{facesContext.currentPhaseId.ordinal eq 6}" 
        label="Start Date" 
        effect="slide" required="true" 
        size="12" 
        showButtonPanel="true" navigator="true"> 

      <p:ajax event="dateSelect" listener="#{discountManagedBean.startDateListener}" 
        onstart="PF('blockDataTableUIWidget').block()" 
        oncomplete="PF('blockDataTableUIWidget').unblock()" 
        update="dataTable"/> 
     </p:calendar> 

    </f:facet> 

    <!--No need to refer to--> 

    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{row.discountStartDate}" converter="#{dateTimeConverter}"/> 
     </f:facet> 
     <f:facet name="input"> 
      <p:tooltip for="dataTableTxtDiscountStartDate" value="#{messages['tooptip.dataTable.popup.calendar']}"/> 
      <p:calendar id="dataTableTxtDiscountStartDate" binding="#{edStartDate}" value="#{row.discountStartDate}" converter="#{dateTimeConverter}" timeZone="Asia/Kolkata" locale="#{localeBean.locale}" pattern="dd-MMM-yyyy hh:mm:ss a" readonly="#{facesContext.currentPhaseId.ordinal eq 6}" label="#{messages['discount.startdate']}" effect="explode" required="true" showButtonPanel="true" navigator="true"/> 
     </f:facet> 
    </p:cellEditor> 
</p:column> 

當日期被從日曆中選擇,在<p:ajax>指定的偵聽器被調用。

public void startDateListener(SelectEvent event) 
{ 
    if(event.getObject() instanceof DateTime) 
    { 
     //org.joda.time.DateTime 
     DateTime startDate=(DateTime) event.getObject(); 
     System.out.println(startDate+" : "+startDate.getZone().getID()+ " : "+startDate.getZone()); 
    } 
} 

選定的日期在該方法中檢索但如何這個日期load()方法內使用?使用org.primefaces.model.LazyDataModel<Discount>

有沒有一種方法可以使用此偵聽器方法中的日期,以便可以根據日曆提供的日期篩選行後更新數據表 - <p:dataTable> - <p:calendar>


這個日期怎麼可以在重寫的load()方法中使用?

@Override 
public List<Discount> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, String> filters) 
{ 
    //Do something with filters to add the date selected from the calendar of the given filter we are talking about. 

    return discountService.getList(first, pageSize, multiSortMeta, filters); 
} 

回答

3

有在data table filters一個主要增強在5月5日PrimeFaces 5.0 finalreleased,2014年

PrimeFaces的DataTable過濾一直是非常有用的功能,快速使用AJAX 過濾器的數據。但是有兩個主要限制;它 只基於字符串比較,不支持自定義的 過濾實現。由於PrimeFaces PRO的贊助, 過濾功能大大增強了PF5。

過濾面

過濾器元件被限制爲輸入文本和天然 下拉,現在如果輸入分量是利用過濾器刻面所定義,它 成爲過濾器。這使得可定製的用戶界面,阿賈克斯更新支持 爲過濾器,使用對象而不是簡單的字符串作爲過濾器值 和更多。

http://blog.primefaces.org/?p=3084

例如,

<p:column id="id" headerText="#{messages['id']}" sortBy="#{row.discountId}" filterBy="#{row.discountId}" filterMatchMode="exact"> 
    <f:facet name="filter"> 
     <p:inputText onkeyup="PF('dataTableUIWidget').filter();" converter="javax.faces.Long" class="ui-column-filter"/> 
    </f:facet> 
    <h:outputText value="#{row.discountId}"/> 
</p:column> 

discountId將由指定的轉換器被轉換爲LongdataTableUIWidget<p:dataTable>widgetVar

LazyDataModel<T>情況下,濾波器的Map的類型已經改變爲Map<String, Object>(從Map<String, String>)兩者load()方法的重載版本。

對於單一列排序,

@Override 
public List<Type> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) { 
    return super.load(first, pageSize, sortField, sortOrder, filters); 
} 

和多個列排序。

@Override 
public List<Type> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) { 
    return super.load(first, pageSize, multiSortMeta, sortOrder, filters); 
} 

至於問題中的例子,它可以被重寫成如下所示。

<p:column id="discountStartDate" headerText="#{messages['discount.startdate']}" filterBy="#{row.discountStartDate}" sortBy="#{row.discountStartDate}" width="200" style="text-align: right;"> 

    <f:facet name="filter"> 
     <p:calendar id="filterStartDate" converter="#{dateTimeConverter}" 
        timeZone="Asia/Kolkata" locale="#{localeBean.locale}" 
        pattern="dd-MMM-yyyy hh:mm:ss a" 
        readonly="#{facesContext.currentPhaseId.ordinal eq 6}" 
        label="#{messages['discount.startdate']}" 
        effect="slide" 
        size="12" 
        onclick="PF('filterStartDateWidget').setDate(null);PF('dataTableUIWidget').filter();" 
        widgetVar="filterStartDateWidget" 
        showButtonPanel="true" navigator="true"> 

      <p:ajax event="dateSelect" 
        onstart="PF('dataTableUIWidget').filter();PF('blockDataTableUIWidget').block();" 
        oncomplete=" PF('blockDataTableUIWidget').unblock();" 
        onerror="alert('error');"/> 
     </p:calendar> 
    </f:facet> 

    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{row.discountStartDate}" converter="#{dateTimeConverter}"/> 
     </f:facet> 
     <f:facet name="input"> 
      <p:tooltip for="dataTableTxtDiscountStartDate" value="#{messages['tooptip.dataTable.popup.calendar']}"/> 
      <p:calendar id="dataTableTxtDiscountStartDate" binding="#{edStartDate}" value="#{row.discountStartDate}" converter="#{dateTimeConverter}" timeZone="Asia/Kolkata" locale="#{localeBean.locale}" pattern="dd-MMM-yyyy hh:mm:ss a" readonly="#{facesContext.currentPhaseId.ordinal eq 6}" label="#{messages['discount.startdate']}" effect="explode" required="true" showButtonPanel="true" navigator="true"/> 
     </f:facet> 
    </p:cellEditor> 
</p:column> 

dateTimeConverterorg.joda.time.DateTime的一種類型。因此,從Object開始,從過濾器Map中取出後,通過此過濾器的日期將以org.joda.time.DateTime的形式提供。

+0

非常感謝! – cdaiga