Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple h:forms in ui:repeat

Tags:

jsf

richfaces

I'm trying to have multiple h:forms on a page which are rendered with a ui:repeat component. If I have only one generated h:form, everything works perfect. If I have multiple h:forms, only the latest h:form will work! (If I try to submit another form then the last, only null is passed trough my service!)

<ui:repeat var="element" value="#{myService.elementList}">



            <rich:simpleTogglePanel switchType="client"
                                    label="#{element.codeElement} - #{element.description}" 
                                    opened="#{myService.isUiSelected(element)}"
                                    onexpand="expand#{element.codeElement}()"
                                    oncollapse="collapse#{element.codeElement}()">



    <h:form id="newKindForm">
      <a:commandLink ajaxSingle="true" id="idLink" onclick="#{rich:component('newTargetPanel')}.show()">
       <a:commandButton id="myButton" 
                        value="new Form"
                    action="#{myService.newForm(element)}"/> 
       </a:commandLink>                
    </h:form>


    <rich:modalPanel id="newTargetPanel" autosized="true" width="450">
       <f:facet name="header">
         <h:outputText value="My Pannel Title" />
       </f:facet>
       <f:facet name="controls">
          <h:panelGroup>
             <h:graphicImage value="/img/close.png" 
                             id="hidelink"
                             styleClass="hidelink" />
                <rich:componentControl for="newTargetPanel" 
                                       attachTo="hidelink"
                                       operation="hide" 
                                       event="onclick" />
          </h:panelGroup>
       </f:facet>



<!-- THIS IS THE PROBLEMATIC FORM -->
<h:form>
     <a:include viewId="../myRepeatableForm.xhtml" />
</h:form>



</rich:modalPanel>



</ui:repeat>

Some suggestion?

Thank You

like image 739
Fab Avatar asked Feb 03 '26 21:02

Fab


1 Answers

you can contain everything in a single form, and use execute attribute to submit only the elements you want. like this:

<h:form id="newKindForm" prependId="false"> <ui:repeat id="newKindRepeat" var="element" value="#{myService.elementList}" varStatus="varStatus"> <h:panelGroup id="newKindPanel"> <a:commandButton id="myButton" execute="newKindRepeat:#{varStatus.index}:newKindPanel" onclick="#{rich:component('newTargetPanel')}.show()" value="new Form" action="#{myService.newForm(element)}"/> </h:panelGroup> </ui:repeat> </h:form>

please notice prependId of h:form, id and varStatus of ui:repeat, execute of a:commandButton.

btw, supposing that a: stands for ajax4jsf, i wouldn't recommend using commandButton nested in commandLink.

like image 67
tt_emrah Avatar answered Feb 05 '26 11:02

tt_emrah



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!