2011-07-12 131 views
11

Primefaces Datatable le permite configurar el tipo de filtrado que utiliza para una columna, utilizando la propiedad filterMatchMode.¿Cómo funciona el filterMatchMode de PrimeFaces DataTable?

Sin embargo, si usa LazyDataModel tiene que implementar su propio método de búsqueda, que no recibe esa propiedad en absoluto. ¿Esta característica solo es útil para los modelos de datos normales?

+0

tema GitHub: https://github.com/primefaces/primefaces/issues/30 – lazlev

Respuesta

12

Actualmente esta función no es compatible con LazyDataModel, sin embargo, todavía puede usarla con relativamente poco esfuerzo. blemasleposted parche correspondiente en el foro de las prima faciales, lamentablemente todavía no hay respuesta de los desarrolladores.

Si desea utilizar la solución no invasiva de código, puede probar la mía.

limitaciones de filtro se obtienen con:

/** 
* @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; 
} 

Dónde FilterMatchMode es:

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

donde se pone ' Método getFiltersMatchMode'? – senyor

+0

@senyor Úselo en la implementación del método 'load LazyDataModel'' load() '. – Micer

Cuestiones relacionadas