Jsf 在p:dataTable上使用自定义全局筛选器

Jsf 在p:dataTable上使用自定义全局筛选器,jsf,primefaces,jsf-2,primefaces-datatable,Jsf,Primefaces,Jsf 2,Primefaces Datatable,我试图在PrimeFaces中使用全局过滤器实现逗号分隔的关键字搜索 如果用户在全局搜索中键入word1、word2,则应返回包含word1和word2的所有行。到目前为止,我无法在PrimeFaces中找到用于全局搜索的预定义多词搜索功能。全局搜索仅适用于单个关键字。例如:仅当用户键入word1或word2时,搜索才会返回结果 PrimeFaces似乎使用客户端API filter()进行全局搜索。有没有一种方法可以实现使用多个关键字的搜索 <p:dataTable id="dwg" w

我试图在PrimeFaces中使用全局过滤器实现逗号分隔的关键字搜索

如果用户在全局搜索中键入
word1、word2
,则应返回包含
word1
word2
的所有行。到目前为止,我无法在PrimeFaces中找到用于全局搜索的预定义多词搜索功能。全局搜索仅适用于单个关键字。例如:仅当用户键入
word1
word2
时,搜索才会返回结果

PrimeFaces似乎使用客户端API filter()进行全局搜索。有没有一种方法可以实现使用多个关键字的搜索

<p:dataTable id="dwg" widgetVar="tblDwgDtl" var="dwgDtl" 
 value="#{dwgCtrlr.dwgs} sortMode="multiple" scrollable="true" 
 styleClass="bsa-drawing" rows="25" resizableColumns="true">
    <f:facet name="header">
        <p:panelGrid styleClass="ui-panelgrid-blank">
                <p:row>
                    <p:column colspan="6">
                        <p:inputText id="globalFilter" 
                        onkeyup="PF('tblDwgDtl').filter()" 
                        placeholder="#{msg['searchAllFields.text']}" />
                    </p:column>
                </p:row>
        </p:panelGrid>
   </f:facet>
PrimeFaces 8.0及以上版本
在PrimeFaces 8.0中,您可以使用
p:dataTable
globalFilterFunction
属性来实现自定义全局过滤器。看见

示例用法:

<p:dataTable ... globalFilterFunction="#{dtFilterView.globalFilterFunction}">
  ...
</p:dataTable>
在PrimeFaces 8.0之前 你能做的就是。然后,将
过滤器功能
替换为自定义版本。因此,您需要扩展
过滤器功能

public boolean globalFilterFunction(Object value, Object filter, Locale locale) {
  String filterText = (filter == null) ? null : filter.toString().trim().toLowerCase();
  if (filterText == null || filterText.equals("")) {
    return true;
  }
  int filterInt = getInteger(filterText);

  Car car = (Car) value;
  return car.getId().toLowerCase().contains(filterText)
          || car.getBrand().toLowerCase().contains(filterText)
          || car.getColor().toLowerCase().contains(filterText)
          || (car.isSold() ? "sold" : "sale").contains(filterText)
          || car.getYear() < filterInt
          || car.getPrice() < filterInt;
}
public boolean globalFilterFunction(Object rowValue, Object filter, Locale locale) {
  String filterText = (filter == null) ? null : filter.toString();
  if (filterText == null || filterText.isEmpty()) {
    return true;
  }
  return Stream.of(filterText.split(","))
          .allMatch(word -> singleWordFilter(value, word));
}

private boolean singleWordFilter(Object rowValue, String word) {
  // do your single word filtering logic
}