Dialog PrimeFaces nao executa button

25 respostas
J

Bom dia pessoal.

Gostaria de saber se alguem já passou por isso, eu já tentei procurar aqui pelo forum mas nao consegui nada que resolvesse o meu problema.

Tenho um xhtml (usando JSF 2.0), onde tenho uma tela que vai ser para passar os parametros para uma chamada de relatorio.
E tenho um xhtml padrao para chamar todos os relatorio, sendo assim gostaria de chamar atravez de um dialog, entao chamo atravez de um include o xhtml.

O grande problema está na hora de clicar no botao para chamar o meu bean, sendo que nao executa o action dele.

meu xhtml que tem a tela para filtro do relatorio:

<h:body>
        <div id="tela" align="center">
            <h:form id="form_rel">
                <h:panelGrid columns="2">
                    <h:outputText value="Data/Hora: " />  
                    <p:calendar locale="pt" value="#{telaAvaliacaoColaborador.data_filtro}" pattern="dd/MM/yyyy" />


                    <h:outputLabel id="latender" value="Usuário:"/>
                    <p:selectOneMenu id="sOMatender" value="#{telaAvaliacaoColaborador.cod_usuario}" height="100" required="true" >
                        <f:selectItem itemLabel="Todos Grupo(s)" itemValue="0" />
                        <f:selectItems id="fsAtender" value="#{telaAvaliacaoColaborador.listaUsuarios()}"
                                       var="item" itemLabel="#{item.descricao}"
                                       itemValue="#{item.id}" />
                    </p:selectOneMenu>

                    <p:commandButton value="Visualizar"
                                     action="#{telaAvaliacaoColaborador.geraRelatorio()}"
                                     icon="ui-icon-print"/>

                </h:panelGrid>
            </h:form>
        </div>
    </h:body>

Aqui tem o meu xhtml que chama por include

<div id="tela_ghu" align="center">
            <p:layout id="ll_guposp" style="height: 500px; width: 770px">
                <p:layoutUnit position="center" size="100" resizable="true" closable="true" collapsible="true" style="text-align: center">
                    <div id="formulario" align="left">
                        <h:form id="bcancelar">
                            <h:panelGrid columns="2">
                                <p:commandButton value=""
                                                 icon="ui-icon-document-b"
                                                 type="button"
                                                 title="Visualizar Relatório"
                                                 onclick="dlgAvaliacaoColb.show();"
                                                 update="dlgAvaliacao"/>
                                <h:outputText value="Relatório Avaliação Colaborador " />
                            </h:panelGrid>
                        </h:form>


                        <h:form id="fdil">
                            <p:dialog id="dlgAvaliacao" header="Relatório Avaliação Colaborador" modal="true" widgetVar="dlgAvaliacaoColb" dynamic="true" appendToBody="true" resizable="false">  
                                <div id="tela_todos" align="left">
                                    <form id="fm_parada">
                                        <ui:include src="relTelaAvaliacaoColaborador.xhtml"/>
                                    </form>
                                </div>
                            </p:dialog> 
                        </h:form>
                    </div>
                </p:layoutUnit>
            </p:layout>
        </div>

e aqui o meu bean que deveria ser executando quando clicado no botao para visualizar: telaAvaliacaoColaborador.geraRelatorio()

@ManagedBean
@SessionScoped
@ViewScoped
public class TelaAvaliacaoColaborador implements Serializable{

    private ResultSet rs;
    private Date data_filtro;
    private Integer cod_usuario;

    public Integer getCod_usuario() {
        return cod_usuario;
    }

    public void setCod_usuario(Integer cod_usuario) {
        this.cod_usuario = cod_usuario;
    }

    public Date getData_filtro() {
        return data_filtro;
    }

    public void setData_filtro(Date data_filtro) {
        this.data_filtro = data_filtro;
    }

    public ArrayList<listaCamposCombo> listaUsuarios() {

        ArrayList<listaCamposCombo> listaItens = new ArrayList<listaCamposCombo>();
        try {
            rs = Conexao.Consulta("select gu.cod_usuario, gu.nome "
                    + "from geral_usuarios gu "
                    + "where gu.status = 1 "
                    + "and gu.tipo_usuario_hd = 1 "
                    + "order by gu.nome");
        } catch (SQLException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Erro ao Carregar Usuários", ex.getMessage()));
        }
        try {
            while (rs.next()) {
                int id = rs.getInt("cod_usuario");
                String nome = rs.getString("nome");
                listaCamposCombo list = new listaCamposCombo(id, nome);
                listaItens.add(list);
            }
        } catch (SQLException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Erro ao Carregar Usuários - Next", ex.getMessage()));
        }

        return listaItens;
    }

    public void geraRelatorio() throws JRException {    
        Map<String, Object> parametros = new HashMap<String, Object>();
        URL reportURL = TelaAvaliacaoColaborador.class.getResource("/RelAvaliacaoColaborador.jasper");
    }

25 Respostas

E

Tente colocar no seu botão Visualizar:

process="form_rel"
J

edudebom, nao funcionou com essa opçao

simplesmente nao acontece nada, se eu ao invez de usar <p:commandbutton usar <h:commandbutton, ele fecha o dialog e nao executa nada tbm.

Obrigado

E

Você tem @SessionScoped e @ViewScoped no seu MB ao mesmo tempo ?

J

Nao, eu tinha para teste e acabei colando junto no exemplo, mas so deixei o @SessionScoped.

E

Certo. Chegou a ver se retorna erro antes de enviar o formulário do dialog ? Por exemplo capturar com o growl.

J

edudebom:
Certo. Chegou a ver se retorna erro antes de enviar o formulário do dialog ? Por exemplo capturar com o growl.

Não, nunca usei o growl para caputrar erros, tens algum exemplo?

Obrigado

E

http://www.primefaces.org/showcase-labs/ui/growl.jsf

Lembre de dar um update no commandButton.

J

Fiz exatamente o exemplo do primefaces e nao executou nada

<h:form>  
            <p:growl id="growl" showDetail="true" sticky="true" />  

            <p:panel header="Growl">  
                <h:panelGrid columns="2">  
                    <h:outputText value="Your Name: *" />   
                    <p:inputText value="#{telaAvaliacaoColaborador.cod_usuario}" required="true" label="Name"/>  
                </h:panelGrid>  

                <p:commandButton value="Save" actionListener="#{telaAvaliacaoColaborador.geraRelatorio}" update="growl"/>  
            </p:panel>  

        </h:form>
E

ok. Coloque um requiredMessage no teu input e envie o form com ele em branco somente para testar.

J

Ok, agora funcionou pefeitamente, executando a mensagem e tbm minha classe, mas tudo isso sem um dialog, se eu colocar um dialog, nao funciona, nao executa o botao

G

Veja se esse exemplo de Dialog te ajuda…

http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionSingle.jsf

Veja tambem sobre o jeito que voce fez seu dialog… voce fez em outro form porque?

Abraços

J

Gleidson Henrique,

Esse exemplo mostra os campos dentro do dialog, isso já está fazendo, mostrando legal, mesmo usando o ui:include

O meu problema está na hora da execução do botao, já coloquei o botao dentro do form que eu chamo pelo INCLUDE e fora tbm, ou seja, no dialog e mesmo assim nao executa o meu action ou actionlistener

Tenho form no meu dialog e na minha tela com os campos, também testei somente com o form na tela dos campos, mas infelizmente nao tive sucesso.
O que eu to querendo fazer, seria a mesma coisa de usar um dialog para trazer campos, e gravar, usando INCLUDE para nao “encher” de telas um unico xhtml, ate ficando mais facil para manutençao.

Se tiveres algum exemplo com o include e o dialog executando um action/actionlistener

Obrigado!!

J

Alguém tem alguma sugestão??

Obrigado!

J

Pessoal, estou com o mesmo problema, alguém já passou por isso?

Att.

J

Joao.Gabriel, eu consegui fazer com que fosse executado o action/actionListener do botao, porém parcialmente resolveu meu problema

escrevia assim o dialog

<p:dialog id="dlgAvaliacao" header="Relatório Avaliação Colaborador" modal="true" widgetVar="dlgAvaliacaoColb" dynamic="true" appendToBody="true" resizable="false">    
                                <div id="tela_todos" align="left">  
                                    <form id="fm_parada">  
                                        <ui:include src="relTelaAvaliacaoColaborador.xhtml"/>  
                                    </form>  
                                </div>  
                            </p:dialog>

e tiver que tirar a parte do modal e do appendToBody, pois como uso <p:layout simplesmente nao executa metodos, assim acabei deixando como modal=false e sem o appendToBody, executou legal

o meu outro problema está em ter “N” dialogs no mesmo xhtml, tudo que coloco no primeiro dialog funciona, nos restantes, acontece o mesmo problema, nao executa o actions/actionlisteners

sendo assim acabei tirando em dialogs e criando forms normamente.
nao sei se isso é um problema do <p:layout ou o que, estou usando a versao do Primefaces 3.3.

Abraços

J

Olá josivanl,

Desculpe pela demora da resposta.

Primeiro, obrigado pela ajuda, acabei no fim adotando a mesma solução que você, ou seja, passei a trabalhar com apenas um dialog para evitar o problema que estávamos tendo.

Att.

J

Pessoal, a propósito, esse tópico tem a ver com quem está utilizando essas mesmas tecnologias.

Link: http://www.guj.com.br/java/284157-jsf-2-com-include-dinamico-de-pagina-dentro-de-jars

Att.

L

Josivanl, estou com o mesmo problema, porém testei sem o <p:layout/> e o <p:layoutUnit/> e funcionou o action do botão. Faz um teste aí!!!

W

Eu tb estou com o mesmo problema. Quando retiro o appendToBody e coloco modal=“false” funciona, mas não fica legal pq perde o foco do dialog aberto.
Tentei colocar também no javascript depois de dar um hidden no dialog dar um submit forçando, mas também não dá o submit.
Tentei trocar o p:commandButton pelo h:commandButton e também não.

Alguém aí tem alguma idéia?

W

… Complementando a última msg que deixei… eu utilizo na página 2 p:dialog e se eu retirar o appendToBody e colocar modal=“false” funciona normalmente os dois p:dialog e seus respectivos p:commandButton.

J

Olá web4u,

Você usa <p:layout/>?

Att.

A

Coloquem ajax = true e o immediated = true no botão

W

Fala ae Joao.Gabriel.
Uso layout sim.

Estou aqui quebrando a cabeça com isso.
Achei alguns links e estou fazendo um caso de teste aqui neste momento.

http://www.java2s.com/Questions_And_Answers/JSF/PrimeFaces/appendToBody.htm

Já eu volto pra informar.

W

Resolvido!!! haha
Acho que nós estamos dando bobeira com relação a montagem da estrutura da página.
No meu caso eu utilizo tanto ui:composition e p:layout e tenho 2 p:dialog.

Meus 2 p:dialog estão com modal=“true” e appendToBody=“true”.

O que eu fiz foi o seguinte:

1 - Deixei um <h:form> para o conteúdo da minha lista no dataTable.
2 - Para um p:dialog dentro dele eu coloquei um <h:form id='form">
por exemplo:
<p:dialog … >
<h:form id=“form1”>
<h:panelGrid … >
<p:commandButton id=“btn1” value=“Enviar” actionListener="#{teste.executar}" ajax=“false”/>
</h:panelGrid>
</h:form>
</p:dialog>

3 - E o outro p:dialog dentro dele eu tb coloquei um form só para ele, mas com um id diferente:
<p:dialog … >
<h:form id=“form2”>
<h:panelGrid … >
<p:commandButton id=“btn2” value=“Enviar” actionListener="#{teste.executar}" ajax=“false”/>
</h:panelGrid>
</h:form>
</p:dialog>

Pronto!
Comigo deu certo!
:smiley:
Vê aí se resolve para vcs, caso contrário deixa aí que tentamos ajudar.

J

Vou comparar a sua solução com a adotada aqui e te aviso.

Obrigado!

Criado 21 de setembro de 2012
Ultima resposta 15 de out. de 2012
Respostas 25
Participantes 7