p:dataTable中的自定义过滤器和转换器

时间:2013-11-24 20:21:24

标签: jsf primefaces datatable jsf-2.2

由于PrimeFaces还不支持<p:dataTable>过滤器的转换器,我正在尝试为<p:calendar>实现我自己的自定义过滤器(当然,这个过滤器的设计看起来仍然有些难看。它需要应用我不能的CSS。

<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()方法中使用此日期? <p:dataTable>使用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);
}

1 个答案:

答案 0 :(得分:4)

2014年5月5日data table filters PrimeFaces 5.0 final released有一项重大改进。

  

PrimeFaces DataTable过滤是一项非常有用的功能   使用ajax过滤数据。但是有两个主要限制;它   仅基于字符串比较而不支持自定义   过滤实现。感谢PrimeFaces PRO的赞助,   PF5的过滤效果大大增强。

     

过滤分面

     

过滤元素仅限于输入文本和原生文本   下拉列表,现在,如果使用过滤器构面定义输入组件,它   成为过滤器。这样可以实现可自定义的UI,ajax更新支持   对于过滤器, 使用对象 而不是简单的字符串作为过滤器值   等等。

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将被指定的转换器转换为LongdataTableUIWidgetwidgetVar的{​​{1}}。

如果是<p:dataTable>,则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> 是一种dateTimeConverter。因此,通过此过滤器传递的日期在org.joda.time.DateTime从过滤器org.joda.time.DateTime中获取后,将以Object形式提供。