Использование нескольких FluidGrids в одной форме
Я работаю над созданием динамической формы с использованием Primefaces 5.2, FluidGrid (PrimeFaces Extensions 3.1.0)
У меня есть форма в нескольких подразделах, поэтому я создаю private HashMap<PDIDefinition, List<FluidGridItem>> formItems;
где PDIDefinition
представляет один раздел формы.
На мой взгляд, я тогда:
<ui:repeat var="pdi" value="#{FormGenerator.formItems.keySet().toArray()}" id="all">
<p:panel header="#{pdi.getFragmentDefinition().getFragmentName()}" style="margin-bottom:1em; width:100%;">
<pe:fluidGrid id="fluidGrid" value="#{FormGenerator.formItems.get(pdi)}" var="data"
hGutter="20" vGutter="10" widgetVar="fluidGridWdgt"
>
<pe:fluidGridItem type="stringValue" >
<div class="dynaFormLabel">
<p:outputLabel for="txt" value="#{data.label}"/>
</div>
<p:inputText id="txt" value="#{data.value}" />
</pe:fluidGridItem>
<pe:fluidGridItem type="integerValue">
<div class="dynaFormLabel">
<p:outputLabel for="int" value="#{data.label}"/>
</div>
<p:spinner id="int" value="#{data.value}" />
</pe:fluidGridItem>
<pe:fluidGridItem type="dateValue" styleClass="calendar">
<div class="dynaFormLabel">
<p:outputLabel for="cal" value="#{data.label}"/>
</div>
<p:calendar id="cal" value="#{data.value}" showOn="button"/>
</pe:fluidGridItem>
</pe:fluidGrid>
</p:panel>
</ui:repeat>
<p:commandButton action="#{FormGenerator.saveValues}" process="form"/>
Как видите, я добавляю панель для каждого раздела, а затем добавляю FluidGrid для каждого раздела.
Однако моя проблема заключается в том, что данные в бэкэнде хранятся только для последней FluidGrid, а не для всех. Я проверил сетевой журнал Chrome и вижу, что все значения передаются на сервер.
Итак, мой вопрос: как я могу гарантировать, что все данные на сервере обновляются. Или: есть ли способ, которым я могу сгруппировать элементы в одной FluidGrid?
Дополнительная информация от бэк-компонента (процесс создания элемента):
private void generateModel() {
fragments = new ArrayList<>();
fragmentValues = new ArrayList<>();
formItems = new HashMap<>();
fields = new ArrayList<>();
for (PDIDefinition pdid : pdiDefinitions) {
Fragment f = new Fragment();
f.setDefinition(pdid.getFragmentDefinition());
fragments.add(f);
List<FluidGridItem> items = new ArrayList<>();
formItems.put(pdid, items);
for (FragmentValueDefinition fvd : f.getDefinition().getFragmentValues()) {
FragmentValue fv = new FragmentValue();
fv.setFragmentValueDefinition(fvd);
fv.setFragmentId(f.getInner());
if (f.getValues() == null) {
f.setValues(new ArrayList<>());
}
f.getValues().add(fv);
fragmentValues.add(fv);
DynamicField df = new DynamicField((fv));
fields.add(df);
if ("String".equals(fvd.getType())) {
items.add(new FluidGridItem(df, "stringValue"));
}
if ("Integer".equals(fvd.getType())) {
items.add(new FluidGridItem(df, "integerValue"));
}
if ("Date".equals(fvd.getType())) {
items.add(new FluidGridItem(df, "dateValue"));
}
}
}
}
РЕДАКТИРОВАТЬ
Изменен xhtml для отражения новых результатов:
Однако значения всех, кроме последней итерации <p:dataList>
не обновляются на сервере при отправке (значения при отправке сбрасываются на клиенте). Значения последней итерации хранятся на сервере.
<p:dataList var="pdi" value="#{FormGenerator.formItems.keySet()}" id="all" varStatus="loop" type="none" >
<p:panel id="panel" header="#{pdi.getFragmentDefinition().getFragmentName()}" style="margin-bottom:1em; width:100%;">
<pe:fluidGrid id="fluidGrid" value="#{FormGenerator.formItems[pdi]}" var="data"
hGutter="20" vGutter="10" >
<pe:fluidGridItem type="stringValue" id="txt_">
<div class="dynaFormLabel">
<p:outputLabel for="txt" value="#{FormGenerator.formItems[pdi][data.id].getData().label}"/>
</div>
<p:inputText id="txt" value="#{FormGenerator.formItems[pdi][data.id].getData().value}"/>
</pe:fluidGridItem>
<pe:fluidGridItem type="integerValue" id="int_">
<div class="dynaFormLabel">
<p:outputLabel for="int" value="#{FormGenerator.formItems[pdi][data.id].getData().label}"/>
</div>
<p:spinner id="int" value="#{FormGenerator.formItems[pdi][data.id].getData().value}" />
</pe:fluidGridItem>
<pe:fluidGridItem type="dateValue" id="cal_">
<div class="dynaFormLabel">
<p:outputLabel for="cal" value="#{FormGenerator.formItems[pdi][data.id].getData().label}"/>
</div>
<p:calendar id="cal" value="#{FormGenerator.formItems[pdi][data.id].getData().value}" showOn="button"/>
</pe:fluidGridItem>
</pe:fluidGrid>
</p:panel>
</p:dataList>
Частичный POST-запрос на отправку, так как Chrome показывает мне:
form:form
form:all:0:fluidGrid:txt:n
form:all:0:fluidGrid:TV5Wd2IL:txt:
form:all:0:fluidGrid:CYqNHGWx:int_input:
form:all:0:fluidGrid:Y6QIaH1C:cal_input:
form:all:1:fluidGrid:hvi81zhh:txt:k
form:all:1:fluidGrid:iY1YsIDm:txt:
form:all:2:fluidGrid:BA6slTyQ:txt:p
я ввел "n","k" и "p" в поля ввода. только "р" был сохранен на сервере.