Как работает filterMatchMode из PrimeFaces DataTable? - PullRequest
11 голосов
/ 12 июля 2011

Primefaces Datatable позволяет вам настроить тип фильтрации, который вы используете для столбца, используя свойство filterMatchMode.

Тем не менее, если вы используете LazyDataModel, вы должны реализовать свой собственный метод поиска, который не получает это свойствосовсем.эта функция полезна только для обычных моделей данных?

1 Ответ

12 голосов
/ 30 октября 2011

В настоящее время эта функция не поддерживается для LazyDataModel "из коробки", однако вы все равно можете использовать ее при относительно небольших усилиях. blemasle опубликовал соответствующий патч на форуме Primefaces, к сожалению, от разработчиков до сих пор нет ответа.

Если вы хотите использовать неинвазивное решение, попробуйте мое.

Ограничения фильтра получаются с помощью:

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

Где FilterMatchMode:

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);
}

}
...