【问题标题】:Custom filters and converters in p:dataTablep:dataTable 中的自定义过滤器和转换器
【发布时间】:2013-11-24 20:21:24
【问题描述】:

由于 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>

当从日历中选择一个日期时,&lt;p:ajax&gt; 中指定的监听器被调用。

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() 方法中使用此日期? &lt;p:dataTable&gt; 使用 org.primefaces.model.LazyDataModel&lt;Discount&gt;

有没有办法通过此侦听器方法使用此日期,以便在根据日历提供的日期过滤行后更新数据表 - &lt;p:dataTable&gt; - &lt;p:calendar&gt;


如何在被覆盖的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);
}

【问题讨论】:

    标签: jsf primefaces datatable jsf-2.2


    【解决方案1】:

    2014 年 5 月 5 日,PrimeFaces 5.0 final releaseddata table filters 进行了重大改进。

    PrimeFaces 数据表过滤是一项有用的功能,可以快速 使用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&lt;p:dataTable&gt;

    对于LazyDataModel&lt;T&gt;,过滤器的Map 的类型已更改为Map&lt;String, Object&gt;(来自Map&lt;String, String&gt;)这两个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 转换为org.joda.time.DateTime 后从过滤器Map 中获取。

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多