2011-07-12 21 views
11

Primefaces Datatableを使用すると、filterMatchModeプロパティを使用して、カラムに使用するフィルタリングタイプを設定できます。PrimeFaces DataTableのfilterMatchModeはどのように動作しますか?

LazyDataModelを使用する場合は、独自の検索メソッドを実装する必要があります。これは、そのプロパティをまったく受け取らないためです。この機能は通常のDataModelにのみ有効ですか?

+0

GitHubの問題:https://github.com/primefaces/primefaces/issues/30あなたは '置く – lazlev

答えて

12

現在のところ、この機能はLazyDataModelのすぐに使用できる機能ではありませんが、比較的簡単に使用できます。 blemasleposted対応版のプライムフェイスフォーラムでは、残念ながら開発者からの回答はまだありません。

非侵襲的なソリューションを使用したい場合は、私を試すことができます。

FilterMatchModeがある
/** 
* @param tableExpr expression, starting from the view root, 
*  which identifies the datatable to retrieve information from 
* @return map, containing pairs of {@code <filtered field id, match mode>}. 
*   Filtered field id is evaluated from the 'filterBy' 
*   attribute of the column in the following way: 
*   #{item.name} -> name 
*   #{item.category.name} -> category.name 
*/ 
public Map<String, FilterMatchMode> getFiltersMatchMode(String tableSearchExpr) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    Object component = context.getViewRoot().findComponent(tableSearchExpr); 

    if (null == component) { 
     throw new IllegalArgumentException(
        "No component found for search expression: " 
          + tableSearchExpr); 
    } 
    if (!(component instanceof DataTable)) { 
     throw new IllegalArgumentException(
        "Component is not a DataTable: " + tableSearchExpr); 
    } 

    DataTable table = (DataTable) component; 
    Map<String, FilterMatchMode> constraints = 
      new HashMap<String, FilterMatchMode>(table.getColumns().size()); 

    for (Column column : table.getColumns()) { 
     ValueExpression filterExpression = 
        column.getValueExpression("filterBy"); 
     if (null != filterExpression) { 
      String filterExpressionString = filterExpression. 
                getExpressionString(); 
      //evaluating filtered field id 
      String filteredField = filterExpressionString.substring(
        filterExpressionString.indexOf('.') + 1, 
        filterExpressionString.indexOf('}')); 

      FilterMatchMode matchMode = 
        FilterMatchMode.fromUiParam(column.getFilterMatchMode()); 

      constraints.put(filteredField, matchMode); 
     } 
    } 

    return constraints; 
} 

public enum FilterMatchMode { 

STARTS_WITH("startsWith"), ENDS_WITH("endsWith"), 
CONTAINS("contains"), EXACT("exact"); 

/** 
* Value of p:column's filterMatchMode attribute 
*  which corresponds to this math mode 
*/ 
private final String uiParam; 

FilterMatchMode(String uiParam) { 
    this.uiParam = uiParam; 
} 

/** 
* @param uiParam value of p:column's filterMatchMode attribute 
* @return MatchMode which corresponds to given UI parameter 
* @throws IllegalArgumentException if no MatchMode 
*   is corresponding to given UI parameter 
*/ 
public static FilterMatchMode fromUiParam(String uiParam) { 
    for (FilterMatchMode matchMode : values()) { 
     if (matchMode.uiParam.equals(uiParam)) { 
      return matchMode; 
     } 
    } 
    throw new IllegalArgumentException("No MatchMode found for " + uiParam); 
} 

} 
+0

フィルタ制約はで得られますgetFiltersMatchMode'メソッド? – senyor

+0

@senyorあなたの 'LazyDataModel'' load()'メソッドの実装でそれを使用してください。 – Micer

関連する問題