1

PrimeFacesの列コンポーネントをdataTable内に拡張しようとしています。主にヘッダーを作成し、関連するファセットを持つ列タグを手動で挿入することなく、キー値に基づいてオブジェクトのフィールドを自動挿入します。

DataTableRendererをオーバーライドするカスタムコンポーネントに次のものがあります。

@Override
public void encodeEnd(FacesContext context, UIComponent component)
        throws java.io.IOException {
    Object columnOrder = component.getAttributes().get("columnOrder");
    if (columnOrder != null) {

        component.getChildren().clear();

        Application application = context.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();

        Column column = new Column();

        Object var = component.getAttributes().get("var");
        String varKey = columnOrder.toString();

        UIOutput header = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        header.setValue(varKey);
        column.getFacets().put("header", header);

        ValueExpression valExpr = expressionFactory.createValueExpression("#{" + var + "." + varKey + "}", String.class);
        UIOutput cell = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        cell.setValueExpression("value", valExpr);


        column.setStyleClass(varKey);
        column.getChildren().add(cell);
        component.getChildren().add(column);

        component.getAttributes().remove("columnOrder");
    }
    super.encodeEnd(context, component);
}

そしてそれをそう呼んでいます

<my:dataTable var="item" value="#{myBean.collection}" columnOrder="field" />

ヘッダーは正しく設定されますが、セルは式を評価するのではなく、文字通り#{item.field}を出力します。

列コンポーネントのsetStyleClassも、目的の効果を発揮できません。

私はスティックの間違った端をつかんで、これについて間違った方向に進んでいると推測しています。

NB。この縮小された例では、columnOrderは単一の文字列であり、ヘッダーはバンドルで検索されるキーのリストではなく、単にキー値を使用すると想定しています。

4

1 に答える 1

1

@maple_shaftは頭に釘を打ちました。

コードをDataTableRendererではなくDataTableをオーバーライドするクラスに移動することで、すべてが機能します。つまり、ElContextにも追加した後です。

更新されたコードは次のとおりです。

@Override
public List<Column> getColumns() {
    if (columns == null) {
        columns = new ArrayList<Column>();

        for (UIComponent child : this.getChildren()) {
            if (child.isRendered() && child instanceof Column) {
                columns.add((Column) child);
            }
        }

        Object columnOrder = this.getAttributes().get("columnOrder");
        if (columnOrder != null) {

            FacesContext context = FacesContext.getCurrentInstance();

            Application application = context.getApplication();
            ExpressionFactory expressionFactory = application.getExpressionFactory();
            ELContext elContext = context.getELContext();

            Column column = new Column();

            Object var = this.getAttributes().get("var");
            String varKey = columnOrder.toString();

            HtmlOutputText header = new HtmlOutputText();
            header.setValue(varKey);
            column.getFacets().put("header", header);

            ValueExpression valExpr = expressionFactory.createValueExpression(elContext, "#{" + var + "." + varKey + "}", String.class);

            HtmlOutputText cell = new HtmlOutputText();
            cell.setValueExpression("value", valExpr);
            column.getChildren().add(cell);

            column.setStyleClass(var + "-" + varKey);
            columns.add(column);

            this.getAttributes().remove("columnOrder");
        }
    }

    return columns;
}
于 2012-07-30T21:24:01.100 に答える