1

Primefaces 2.2 では、DataTable の選択を取得したい場合、検証が失敗したりコンバーターが失敗したりせずにデータテーブルをコミットする必要があります。

以下のように:

        <p:dataTable update="outputPanel" id="dataTable" var="car" 
                value="#{tableBean.cars}" selection="#{tableBean.selectedCars}">

                <p:column selectionMode="multiple" />
                <p:column style="width:200px" id="Model">
                    <f:facet name="header">
                        Model
                   </f:facet>
                    <h:outputText value="#{car.model}" />
                    <h:inputText value="#{car.model}" >
                        <f:attribute name="datatableClientId" value="form:dataTable" />
                        <f:attribute name="datatable" value="#{dataTableBinding}" />
                        <f:validator validatorId="dataTableRequiredValidator" />
                    </h:inputText>
                </p:column>

            </p:dataTable>

バリデーターが失敗した場合、バリデーターで selectedCars を取得する方法は?

4

1 に答える 1

1

Primefaces 2.2のソースコードを調べます。データテーブルをデコードするときに、DataHelperクラスを使用してdecodeSelectionを実行します。したがって、以下のように、コードをコピーしてutilクラスを記述します。

//when the validator in a row, the datatable clientId will be wrong append the row number. so please specify the table clientId.
    public Object getDataTableSelection(FacesContext context, DataTable table, String dataTableclientId) {
        String clientId = dataTableclientId != null ? dataTableclientId : table.getClientId(context);
        Map<String, String> params = context.getExternalContext().getRequestParameterMap();

        String selection = params.get(clientId + "_selection");
        Object data = null;
        if (table.isSingleSelectionMode()) {
            data = decodeSingleSelection(table, selection);
        } else {
            data = decodeMultipleSelection(table, selection);
        }
        table.setRowIndex(-1); // clean
        return data;
    }

    private Object decodeSingleSelection(DataTable table, String selection) {
        Object data = null;
        if (isValueBlank(selection)) {
            table.setSelection(null);
            table.setEmptySelected(true);

        } else {
            int selectedRowIndex = Integer.parseInt(selection);
            int first = table.getFirst();
            int rows = table.getRows();
            int last = rows == 0 ? table.getRowCount() : rows;

            if (first <= selectedRowIndex && (first + last) > selectedRowIndex) {
                table.setRowIndex(selectedRowIndex);
                data = table.getRowData();
                table.setSelection(table.getRowData());
            }
        }
        return data;
    }

    private boolean isValueBlank(String value) {
        if (value == null)
            return true;

        return value.trim().equals("");
    }

    private Object decodeMultipleSelection(DataTable table, String selection) {
        Class<?> clazz =
            table.getValueExpression("selection").getType(FacesContext.getCurrentInstance().getELContext());
        Object data = null;
        if (isValueBlank(selection)) {
            data = Array.newInstance(clazz.getComponentType(), 0);
            table.setSelection(data);

        } else {
            if (!table.isCellSelection()) {
                String[] rowSelectValues = selection.split(",");
                data = Array.newInstance(clazz.getComponentType(), rowSelectValues.length);

                for (int i = 0; i < rowSelectValues.length; i++) {
                    table.setRowIndex(Integer.parseInt(rowSelectValues[i]));

                    Array.set(data, i, table.getRowData());
                }
                table.setSelection(data);
            }
        }
        return data;
    }

したがって、このgetDataTableSelection(current facescontext instance, datatable instance, table clientId)メソッドを使用して選択を取得できます。配列オブジェクトが返されます(nullになることはありません)。

注:バリデーターが行にある場合、データテーブルclientIdは間違って行番号を追加します。したがって、テーブルclientIdを指定してください。

于 2013-02-27T08:42:56.593 に答える