quarta-feira, 10 de novembro de 2010

Modal como parte do formulário

Tenho um determinado formulário que pode (ou não) necessitar de mais informações. Então, o botão salvar é:

<a4j:commandButton id="btnSalvar" value="Salvar"
onclick="if(#{mMeuBean.mostrarPopup}){ Richfaces.showModalPanel('meuPopup'); return false; }"
action="#{mMeuBean.salvar}" reRender="meuPopup" />

Este popup, o 'meuPopup' é o rich modalPanel com informações ADICIONAIS. Na verdade, é uma extensão do formulário original, nada mais que isso.

<rich:modalPanel id="popupPublicarSetups" minWidth="400" minHeight="420" resizeable="true">
        <f:facet name="header">
<h:outputText value="Titulo"></h:outputText>
</f:facet>
<f:facet name="controls">
</f:facet>
<h:form id="outroForm" styleClass="form">
<h:outputText value="Info adicional:" />
        <h:inputText value="#{meuBean.info}" />

<h:panelGroup styleClass="divBotoes" layout="block">
<a4j:commandButton value="OK" styleClass="botoes" limitToList="true"
      action="#{mMeuBean.salvar}"
      oncomplete="Richfaces.hideModalPanel('meuPopup');" reRender="msgErros" />
<a4j:commandButton value="Cancelar" styleClass="botoes"
ajaxSingle="true" limitToList="true"
onclick="Richfaces.hideModalPanel('meuPopup'); " />
</h:panelGroup>
    </h:form>
</rich:modalPanel>


O grande problema era: se eu colocasse no mesmo form, o valor dos campos no popup não eram enviados; se colocasse em forms separados, o conteúdo original não era enviado. Pela documentação do modalPanel, não se deveria usar o mesmo form para modal e a página:
http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_single/index.html#rich_modalPanel.

De qualquer jeito eu tentei colocar no mesmo form, tentei fazer a4j:form, tentei ajaxSubmit nele, e nada se comportava como eu desejava. Não me restou muita coisa além de fazer dois submits. Eu poderia enviar antes de mostrar o popup ou fazer dois submits simultâneos no 'OK' do popup; preferi a última.

Inclui um botão sem 'onclick' no formulario original:
<a4j:commandButton id="btnSalvarHidden" value="" style="display:none"
action="#{mMeuBean.salvar}" styleClass="botoes" />

E modifiquei o botão do popup para clicar nele:
<a4j:commandButton value="OK" styleClass="botoes" limitToList="true"
action="#{mMeuBean.salvarPops}"
oncomplete="jQuery('[id$=btnSalvarHidden]').click();Richfaces.hideModalPanel('meuPopup'); "

reRender="msgErros" />

A ação 'salvarPops' simplesmente retorna null.