Criar form dentro de form (RESOLVIDO)

22 respostas
oliveira_lb

Ola!!! Preciso criar uma tela de cadastro onde o usuario informa seus dados e os dados da empresa, caso a empresa não esteja
cadastrada ele tem que cadastra-la. Após o cadastro da empesa a lista que contem as mesmas deve ser atualizada ja mostrando a empresa
que ele cadastrou.

Para isso fiz dois forms, um dentro do outro… Na tab que contem os dados da empresa fiz tab view mostrando em abas, a aba que contem o form da nova empresa
possui um botão a parte para cadastrar só a empresa…

Segue o codigo

<h:form  id="form1" prependId="true">
    <p:growl id="id" showDetail="true" life="3000" />
    <p:tabView id="tabViewUsu" dynamic="true" cache="true">
        <p:tab id="usuario" title="Dados do Usuário">
             <h:panelGrid columns="2" cellspacing="3">

                <h:outputText value="Nome: *" />
                <h:inputText id="nome" value="#{funcionarioBean.funcionario.nome}" required="true" requiredMessage="Campo Nome é Obrigatório"/>

                <h:outputText value="Sobrenome: *" />
                <h:inputText id="sobrenome" value="#{funcionarioBean.funcionario.sobreNome}" required="true" requiredMessage="Campo Sobrenome é Obrigatório"/>

                <h:outputText value="Data Nasc.: *" />
                <h:inputText id="dt" value="#{funcionarioBean.funcionario.nascimento}" required="true" requiredMessage="Campo Data de Nascimento é Obrigatório"/>

                <h:outputText value="Email: *" />
                <h:inputText id="email" value="#{funcionarioBean.funcionario.email}" required="true" requiredMessage="Campo Email é Obrigatório"/>

                <h:outputText value="Telefone: *" />
                <h:inputText id="tel" value="#{funcionarioBean.funcionario.telefone}" required="true" requiredMessage="Campo Telefone é Obrigatório"/>

             </h:panelGrid>
        </p:tab>
    </p:tabView>
    <br></br>
    <p:tabView id="tabViewLog" dynamic="true" cache="true">
        <p:tab id="idLogin" title="Dados de Login">
            <h:panelGrid columns="2" cellspacing="3">

                <h:outputText value="Usuário: *" />
                <h:inputText id="login" value="#{funcionarioBean.funcionario.login}" required="true" requiredMessage="Campo Usuário é Obrigatório"/>

                <h:outputText value="Senha: *" />
                <h:inputSecret id="senha" value="#{funcionarioBean.funcionario.senha}" required="true" requiredMessage="Campo Senha é Obrigatório"/>

            </h:panelGrid>
        </p:tab>        
    </p:tabView>  
    <br></br>
    <p:tabView id="tabViewEmp" dynamic="true" cache="true">
        
      <!-- **********************Aba dados Sobre a Empresa *********************************  -->
    
        <p:tab id="empresa" title="Dados da Empresa">         
            <h:panelGrid columns="2" cellspacing="9">
            
                <h:outputText value="Empresa: *" />                
                <h:selectOneMenu   id="empresa2"
                                   required="true"
                                   value="#{cargoBean.idSelectEmpresa}">
                                     
                    <f:selectItem  itemValue="0" 
                                   itemLabel="Selecione..."/> 
                                     
                    <f:selectItems value="#{empresaBean.listaEmpresa}"
                                   var="v"  
                                   itemValue="#{v.idEmpresa}" 
                                   itemLabel="#{v.nome}"/> 
                                     
                    <f:ajax event="change" 
                            render="cargo" 
                            listener="#{cargoBean.carregaComboEmpresaCargo(event)}"/>                                          
                </h:selectOneMenu>
                  
                <h:outputText value="Cargo: *" />
                <h:selectOneMenu id="cargo" 
                                 value="#{cargoBean.idSelectCargo}"
                                 rendered="true">
                                   
                    <f:selectItems value="#{cargoBean.listaEmpresaCargo}" />
                      
                </h:selectOneMenu>
            
            </h:panelGrid>
        </p:tab>
        
        <!-- **********************Aba para criar nova empresa | AQUI CONTEM UM NOVO FORM *********************************  -->  
        <p:tab title="Nova Empresa" rendered="true">
        <h:form id="formNovaEmpresa" prependId="true">    
            <h:panelGrid columns="4" cellspacing="3" >   
                <h:outputText value="Empresa: *" />
                <h:inputText id="nomeEmp" value="#{empresaBean.empresa.nome}" required="true" requiredMessage="Campo Nome é Obrigatório"/>

                <h:outputText value="CNPJ: *" />
                <h:inputText id="cnpjEmp" value="#{empresaBean.empresa.cnpj}" required="true" requiredMessage="Campo CNPJ é Obrigatório"/>

                <h:outputText value="Email: *" />
                <h:inputText id="emailEmp" value="#{empresaBean.empresa.email}" required="true" requiredMessage="Campo Email é Obrigatório"/>
                
                <h:outputText value="Cargos: *" />
                <h:inputText id="CargoEmp" value="#{cargoBean.cargo.stringCargos}" required="true" requiredMessage="Cadastre pelo menos um cargo"/>
 
            </h:panelGrid>
            <br></br>
            <h:outputText value="obs.: Informe os cargos separados por vírgula. Ex.: Gerente,Supervisor,Analista... " />
            <br></br>
            <br></br>
            <p:commandButton id="btn2" 
                             value="Cadastrar" 
                             disabled="#{empresaBean.showComponentes}"  
                             type="submit" 
                             action="#{empresaBean.novaEmpersa(e)}" 
                             ajax="false"/>
        </h:form>
        </p:tab>
            
    </p:tabView>
    
    <br></br>
    <p:commandButton id="btnO" 
                     value="Cadastrar" 
                     type="submit" actionListener="#{funcionarioBean.salvar(e)}" 
                     ajax="false"
                     />
                             
</h:form>

O botão do form para cadastrar nova empresa não acessa o metodo, testei debugando… Já esse ultimo botao do form principal funciona perfeitamente,
testei a chamada do metodo do form interno no botao do metodo principal e também funcionou…
Bom, essa foi uma ideia que tive, porém se houver outra forma de fazer isso… Gostaria de opiniões e ajuda…
Ate mais

22 Respostas

tmvolpato

Evite usar dessa maneira

e seu problema nem necessita disso
da para fazer em apenas um form

A Classe funcionario tem relacionamento com a Classe Empresa?

poste suas classes

oliveira_lb

Obrigado pela resposta.
Existem relacionamentos entre funcionario e empresa; empresa com cargo…

Segue as classes

Funcionario.java

package Model;

/**
 *
 * @author VIRTUALWEB
 */
public class Funcionario extends Pessoa{
    
    private int idFuncionario;  // PK
    private int idCargo;        // FK
    private int idEmpresa;      // FK
    private String login;
    private String senha;
    private int nivel;
    private String status;   

    public int getIdFuncionario() {
        return idFuncionario;
    }

    public void setIdFuncionario(int idFuncionario) {
        this.idFuncionario = idFuncionario;
    }

    public int getIdCargo() {
        return idCargo;
    }

    public void setIdCargo(int idCargo) {
        this.idCargo = idCargo;
    }

    public int getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(int idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public int getNivel() {
        return nivel;
    }

    public void setNivel(int nivel) {
        this.nivel = nivel;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }    
}

Empresa.java

package Model;

import java.io.Serializable;

/**
 *
 * @author VIRTUALWEB
 */
public class Empresa implements Serializable{
    
    private int idEmpresa;
    private String nome;
    private String cnpj;
    private String email;
    private String telefone;

    public int getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(int idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

}

Cargo.java

package Model;

import java.io.Serializable;

/**
 *
 * @author VIRTUALWEB
 */
public class Cargo implements Serializable{
    
    private int idCargo;
    private int idEmpresa;
    private String nomeCargo;
    private Empresa empresa;
    private String stringCargos = ""; //Recebe uma String contendo os cargos separados por virgula.

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public int getIdCargo() {
        return idCargo;
    }

    public void setIdCargo(int idCargo) {
        this.idCargo = idCargo;
    }

    public int getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(int idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    public String getNomeCargo() {
        return nomeCargo;
    }

    public void setNomeCargo(String nomeCargo) {
        this.nomeCargo = nomeCargo;
    }
    
    public String getStringCargos() {
        return stringCargos;
    }

    public void setStringCargos(String stringCargos) {
        this.stringCargos = stringCargos;
    }
}
jeanmalvessi

Não entendi por que criar um outro form… Não há necessidade para tal!

Hebert_Coelho

Não crie um form dentro do outro. Isso não é correto nem pelas regras de HTML básico.

O que você pode fazer é abrir um dialog com um form próprio e cadastrar os dados lá. E quando a ação finalizar, você atualiza todos os dados via Ajax.

oliveira_lb

Tentei fazer com dialog antes, porém ao clicar no botão que chamará o dialog ele exibe as mensagens de erro relacionando ao preenchimento de campos obrigatório
e nao exibe o dialog…

jeanmalvessi

oliveira_lb:
Tentei fazer com dialog antes, porém ao clicar no botão que chamará o dialog ele exibe as mensagens de erro relacionando ao preenchimento de campos obrigatório
e nao exibe o dialog…

Estava tentando enviar o formulário. Provavelmente o process do seu botão estava apontando para o lugar errado… Se quiser tentar novamente, pode fazer e postar pra nós vermos

Hebert_Coelho

oliveira_lb:
Tentei fazer com dialog antes, porém ao clicar no botão que chamará o dialog ele exibe as mensagens de erro relacionando ao preenchimento de campos obrigatório
e nao exibe o dialog…
Você estava chamando a Dilog por ajax? O botão que chamada o Dialog estava com imediate=true ?

jeanmalvessi

Outra coisa, o type padrão do p:commandButton é “submit”. Portanto não há necessidade de informar

oliveira_lb

Refiz aqui, ficou mais ou menos assim

<p:tab title="Nova Empresa" rendered="true">    
            <p:commandButton id="basic" value="Cadastrar" onclick="dlg1.show();" type="button" />  
        </p:tab>

<p:dialog id="basicDialog" header="Basic Dialog" widgetVar="dlg1"> 
    
    <h:form id="form2">
    <h:panelGrid columns="4" cellspacing="3" >   
            
        <h:outputText value="Empresa: *" />
        <h:inputText id="nomeEmp" value="#{empresaBean.empresa.nome}" required="true" requiredMessage="Campo Nome é Obrigatório"/>

        <h:outputText value="CNPJ: *" />
        <h:inputText id="cnpjEmp" value="#{empresaBean.empresa.cnpj}" required="true" requiredMessage="Campo CNPJ é Obrigatório"/>

        <h:outputText value="Email: *" />
        <h:inputText id="emailEmp" value="#{empresaBean.empresa.email}" required="true" requiredMessage="Campo Email é Obrigatório"/>

        <h:outputText value="Cargos: *" />
        <h:inputText id="CargoEmp" value="#{cargoBean.cargo.stringCargos}" required="true" requiredMessage="Cadastre pelo menos um cargo"/>


        <br></br>
        <h:outputText value="obs.: Informe os cargos separados por vírgula. Ex.: Gerente,Supervisor,Analista... " />
        <br></br> 
        <p:commandButton id="btn2" 
                     value="Cadastrar" 
                     type="submit" actionListener="#{empresaBean.salvar(e)}" 
                     ajax="false"/>
        
     </h:panelGrid>               
    </h:form>
</p:dialog>

Parou de exibir as mensagens porém o dialog não é aberto

oliveira_lb

Retirei o type do botão que chama o dialog, as mensagens de preenchimento de campos obrigatórios voltaram a aparecer e o dialog continua
nao abrindo.

jeanmalvessi

Coloque um process=“form2” no botão

oliveira_lb

Coloquei ficando desta forma

&lt;p:tab title="Nova Empresa" rendered="true"&gt; &lt;p:commandButton id="basic" value="Cadastrar" onclick="dlg1.show();" process="form2" /&gt; &lt;/p:tab&gt;

O botão sumiu ficando apenas uma linha fininha com possibilidade de seleção, ao clicar exibe o erro:

Não é possível encontrar o componente com "form2" identificador em vista.
jeanmalvessi

Tenta agora: process=":form2"

oliveira_lb

O botão apareceu porém ao clicar ainda exibe as msg…

Pensei em alterar o tipo do botão para &lt;p:commandLink assim crio uma página de cadastro separado.
A ideia é o usuário chamar esta nova pagina, cadastrar e depois através de outro link voltar a pagina de cadastro.
Seria viável? o problema é ir e voltar deixando os campos anteriores do cadastro principal ainda preenchidos…;

oliveira_lb

Não sei se tem alguma coisa a ver, mais tentei colocar um mask em um campo input e o mesmo também não funcionou.
Será que meu sistema está com BUG?

jeanmalvessi

O botão apareceu porém ao clicar ainda exibe as msg…

Pensei em alterar o tipo do botão para &lt;p:commandLink assim crio uma página de cadastro separado.
A ideia é o usuário chamar esta nova pagina, cadastrar e depois através de outro link voltar a pagina de cadastro.
Seria viável? o problema é ir e voltar deixando os campos anteriores do cadastro principal ainda preenchidos…;

Uma troca de página seria um transtorno ainda maior.

Eu deixaria o botão assim:

&lt;p:commandButton id="btn2"   
                 value="Cadastrar"   
                 action="#{empresaBean.salvar()}"   //Aqui entra um detalhe.. você está passando um 'e' como parâmetro, o que seria este 'e' ? O MB não precisa receber parâmetros.
                 process=":form2"/&gt;

Se puder, poste o método salvar() pra eu dar uma olhada!

oliveira_lb

Esse parâmetro process=":form2" eu o coloquei no botão que chama o dialog e não no botão que esta dentro do dialog… Tem algo a ver???

Quanto ao botão citado acima a ação dele nem chega a ser executa por o dialog não abre o form. Repare que o botão do form principal, o de cadastro dos dados também
possui o mesmo parâmetro no método salvar.
eis o método

public void salvar(ActionEvent e) throws ParseException, SQLException { dao.Salvar(empresa); }

Este método funcionar, testei ele através do mesmo botão porém em área diferente do form, se eu não passar o parâmetro (e) ele não reconhece o método.

jeanmalvessi

O botão de Gravar deve obrigatoriamente processar o formulário a que se refere, para poder mandar as informações ao bean. Tente fazer isso dentro do dialog e veja se o método salvar é chamado

oliveira_lb
Nao deu... Segue a pagina xhtml com as atualizações que fiz
<h:form  id="form1" prependId="false">
    <p:growl id="id" showDetail="true" life="4000" />
    <p:tabView id="tabViewUsu" dynamic="true" cache="true">
        <p:tab id="usuario" title="Dados do Usuário">
             <h:panelGrid columns="2" cellspacing="3">

                <h:outputText value="Nome: *" />
                <h:inputText id="nome" value="#{funcionarioBean.funcionario.nome}" required="true" requiredMessage="Campo Nome é Obrigatório"/>

                <h:outputText value="Sobrenome: *" />
                <h:inputText id="sobrenome" value="#{funcionarioBean.funcionario.sobreNome}" required="true" requiredMessage="Campo Sobrenome é Obrigatório"/>

                <h:outputText value="Data Nasc.: *" />
                <h:inputText id="dt" value="#{funcionarioBean.funcionario.nascimento}" required="true" requiredMessage="Campo Data de Nascimento é Obrigatório"/>

                <h:outputText value="Email: *" />
                <h:inputText id="email" value="#{funcionarioBean.funcionario.email}" required="true" requiredMessage="Campo Email é Obrigatório"/>

                <h:outputText value="Telefone: *" />
                <h:inputText id="tel" value="#{funcionarioBean.funcionario.telefone}" required="true" requiredMessage="Campo Telefone é Obrigatório"/>

             </h:panelGrid>
        </p:tab>
    </p:tabView>
    <br></br>
    <p:tabView id="tabViewLog" dynamic="true" cache="true">
        <p:tab id="idLogin" title="Dados de Login">
            <h:panelGrid columns="2" cellspacing="3">

                <h:outputText value="Usuário: *" />
                <h:inputText id="login" value="#{funcionarioBean.funcionario.login}" required="true" requiredMessage="Campo Usuário é Obrigatório"/>

                <h:outputText value="Senha: *" />
                <h:inputSecret id="senha" value="#{funcionarioBean.funcionario.senha}" required="true" requiredMessage="Campo Senha é Obrigatório"/>

            </h:panelGrid>
        </p:tab>        
    </p:tabView>  
    <br></br>
    <p:tabView id="tabViewEmp" dynamic="true" cache="true">
        <!-- **********************Aba dados Sobre a Empresa *********************************  -->    
        <p:tab id="empresa" title="Dados da Empresa">         
            <h:panelGrid columns="2" cellspacing="9">
            
                <h:outputText value="Empresa: *" />                
                <h:selectOneMenu   id="empresa2"
                                   required="true"
                                   value="#{cargoBean.idSelectEmpresa}">
                                     
                    <f:selectItem  itemValue="0" 
                                   itemLabel="Selecione..."/> 
                                     
                    <f:selectItems value="#{empresaBean.listaEmpresa}"
                                   var="v"  
                                   itemValue="#{v.idEmpresa}" 
                                   itemLabel="#{v.nome}"/> 
                                     
                    <f:ajax event="change" 
                            render="cargo" 
                            listener="#{cargoBean.carregaComboEmpresaCargo(event)}"/>                                          
                </h:selectOneMenu>
                  
                <h:outputText value="Cargo: *" />
                <h:selectOneMenu id="cargo" 
                                 value="#{cargoBean.idSelectCargo}"
                                 rendered="true">
                                   
                    <f:selectItems value="#{cargoBean.listaEmpresaCargo}" />
                      
                </h:selectOneMenu>
            
            </h:panelGrid>
        </p:tab>
        
        <!-- **********************Aba dados Sobre a Empresa *********************************  -->  
        <p:tab title="Nova Empresa" rendered="true">    
            <p:commandButton id="basic" value="Cadastrar" onclick="dlg1.show();" process=":form2" />  
        </p:tab>
            
    </p:tabView>
    
    <br></br>
    <p:commandButton id="btnO" 
                     value="Cadastrar" 
                     type="submit" actionListener="#{funcionarioBean.salvar(e)}" 
                     ajax="false"
                     update="id"
                     process=":form2"/>
                             
</h:form>
    
<!-- Dialog de criação de uma nova empresa -->
<p:dialog id="basicDialog" header="Cadastro de Empresas" widgetVar="dlg1"> 
    
    <h:form id="form2">
    <h:panelGrid columns="4" cellspacing="3" >   
            
        <h:outputText value="Empresa: *" />
        <h:inputText id="nomeEmp" value="#{empresaBean.empresa.nome}" required="true" requiredMessage="Campo Nome é Obrigatório"/>

        <h:outputText value="CNPJ: *" />
        <h:inputText id="cnpjEmp" value="#{empresaBean.empresa.cnpj}" required="true" requiredMessage="Campo CNPJ é Obrigatório"/>

        <h:outputText value="Email: *" />
        <h:inputText id="emailEmp" value="#{empresaBean.empresa.email}" required="true" requiredMessage="Campo Email é Obrigatório"/>

        <h:outputText value="Cargos: *" />
        <h:inputText id="CargoEmp" value="#{cargoBean.cargo.stringCargos}" required="true" requiredMessage="Cadastre pelo menos um cargo"/>


        <br></br>
        <h:outputText value="obs.: Informe os cargos separados por vírgula. Ex.: Gerente,Supervisor,Analista... " />
        <br></br> 
        <p:commandButton id="btn2" 
                     value="Cadastrar" 
                     actionListener="#{empresaBean.salvar(e)}" 
                     ajax="false"
                     process=":form2" />
        
     </h:panelGrid>               
    </h:form>
</p:dialog>
jeanmalvessi

Tire o process=":form2" deste botão.

&lt;!-- **********************Aba dados Sobre a Empresa ********************************* --&gt; &lt;p:tab title="Nova Empresa" rendered="true"&gt; &lt;p:commandButton id="basic" value="Cadastrar" onclick="dlg1.show();" process=":form2" /&gt; &lt;/p:tab&gt;

E este deve ter o process apontando para “form1”

&lt;p:commandButton id="btnO" value="Cadastrar" type="submit" actionListener="#{funcionarioBean.salvar(e)}" ajax="false" update="id" process=":form2"/&gt;

oliveira_lb

jeanmalvessi agradeço demais sua ajuda , achei o problema aqui…
No inicio da pagina fiz link para alguns arquivos javascripts e estes arquivos entraram em conflito com o restante do código.
Retirei os links e tudo funcionou perfeitamente inclusiva o mask nos campos input…

Sou grato pela atenção que meu deu.
Vlw

jeanmalvessi

Maravilha!

Criado 3 de outubro de 2012
Ultima resposta 3 de out. de 2012
Respostas 22
Participantes 4