Thomas Walther
Thomas Walther

Reputation: 556

submit multiple forms with p:commandbutton

I want to submit multiple forms with one submit button. I have multiple forms because each p:fileUpload needs an own form (when in advanced mode).

Here's the code for my submit button:

<h:form id="form1">...</h:form>
<h:form id="form2">...</h:form>
<h:form>
    <p:commandButton value="Save" widgetVar="saveButtonBottom"
    action="#{bean.submit}" ajax="false"
    process=":form1,:form2,@this" />
</h:form>

It does call bean.submit(), but it does not process the other forms. Maybe my understanding of processing is wrong, but I thought if I put a form into "process", then it will be submitted.

Any idea how to make it work?

Upvotes: 8

Views: 17988

Answers (4)

theo231022
theo231022

Reputation: 329

in your

<p:commandButton value="Save" widgetVar="saveButtonBottom"
    action="#{bean.submit}" ajax="false"
    process=":form1,:form2,@this" />

add the attribute: partialSubmit="true" and chance ajax="false" to ajax="true"

<p:commandButton partialSubmit="true" value="Save" widgetVar="saveButtonBottom"
    action="#{bean.submit}" ajax="true"
    process=":form1,:form2,@this" />

Upvotes: 4

amandep
amandep

Reputation: 51

Place this inside form2:

<p:remoteCommand name="sendAjaxicalPGfilter"
update="form2:minMaxTable"
action="#{OptimizationSettingsBean.handleProductGroupChange}"  />

call this on form1 command button

<p:commandButton value="Done"
oncomplete="selectedSettingDlg.hide();" onstart="sendAjaxicalPGfilter();"
ajax="true" action="#{CreateSourcingPlanBean.dummy}" 
                            update=":form1:assignmentList" >
                </p:commandButton>

Upvotes: 5

rootkit
rootkit

Reputation: 2165

As BalusC correctly pointed out you can only submit one form in one request. However, you can invoke multiple requests with one button click:

<p:commandButton value="Save" widgetVar="saveButtonBottom"
    action="#{bean.submit}" ajax="false" onstart="form1submitbutton.getJQ().click();form2submitbutton.getJQ().click()"
    process="@form" />

You have to realize this will result in multiple simultaneous requests being processed by your server, and there are no guarantees as to request processing order. This can make validation and backend data processing tricky. You could try to work around that by using oncomplete handler and fire form submissions in sequence this way, but still this means your forms data will be sent to the server one-by-one.

Also, the above approach will only work if your forms are submitted via ajax.

Upvotes: 3

BalusC
BalusC

Reputation: 1108632

That's the limitation of HTML. Only the input data containing within the current form (wherein the command is been invoked) will be sent to the server side. As to the process attribute, that only identifies which part(s) of that submitted data must be processed by JSF after they have arrived.

Any idea how to make it work?

Put all related data in the same form. Use if necessary just a single <p:fileUpload> with multiple file selection support.

Upvotes: 7

Related Questions