PrimeFaces + Ajax

3 respostas
Talius

Bom dia,

Estou tendo alguns problemas com PrimeFaces e Ajax.
Tenho um cadastro e nele há a chamada de um <p:dialog> que realiza o cadastro de um produto.

Dentro desse <p:dialog>, ao clicar no Finalizar, eu realizo uma validação dos campos e, se o cadastro não passar por alguma das validações, o dialog deve ser atualizado pra conter uma mensagem dizendo qual o erro.

Se ele for concluído com sucesso, o dialog deve ser fechado, e a página principal deve ser atualizada contendo os dados do produto cadastrado, e tudo segue normalmente.

O que acontece é que, se eu colocar pro dialog ser fechado no oncomplete, ele fecha sempre.

Não estou conseguindo fazer isso. Ou ele sempre fecha, ou não fecha nunca.

Segue parte do código…

Controller

public void novoProduto(ActionEvent evt) throws Exception{
        if((nomeProduto != null) && (!nomeProduto.equals(""))){
            if((codFuncaoProduto != null) && (!codFuncaoProduto.equals("0")) && (!codFuncaoProduto.equals(""))){
                if((codFabricante != null) && (!codFabricante.equals("0")) && (!codFabricante.equals(""))){
                    Produto p = new Produto();

                    //Adicionar nome
                    p.setDescricao(nomeProduto);

                    //Adicionar Funcao
                    p.setFuncao(codFuncaoProduto);

                    //Adicionar Fabricante
                    Fabricante f = new Fabricante();
                    f = (Fabricante) (dao.buscarPorCampo(new Fabricante(), "CodFabricante", codFabricante));
                    p.setFabricante(f);

                    //Definir Propriedade
                    p.setPropriedade(propriedade);

                    //Definir Status
                    p.setStatus('A');

                    //Gravando o produto na base
                    dao.gravar(p);
                    produto = p;
                            
                }else{
                    FacesContext.getCurrentInstance().addMessage(null, new TratamentoErro(TratamentoErro.SELECIONA_FABRICANTE).getFacesMessage());
                }
            }
            else{
                FacesContext.getCurrentInstance().addMessage(null, new TratamentoErro(TratamentoErro.SELECIONA_FUNCAO).getFacesMessage());
            }

        }
        else{
            FacesContext.getCurrentInstance().addMessage(null, new TratamentoErro(TratamentoErro.SEM_NOME_PRODUTO).getFacesMessage());
        }
    }

Dialog

<p:dialog id="outrodialog" widgetVar="outrodialog" width="800" close="true" fixedCenter="true" resizable="false"
                        modal="false" draggable="false" underlay="none">
                    <p:panel id="painelNovoProduto">
                        <f:facet name="header">
                        <h:outputText value="Novo Produto: " />
                        </f:facet>

                        <h:panelGrid columns="2" >
                        <h:outputText value="Nome: " />
                        <h:inputText value="#{operacaoController.nomeProduto}" />

                        <h:outputText value="Funçao: " />
                        <h:selectOneMenu id="slcFuncao" value="#{operacaoController.codFuncaoProduto}">
                            <f:selectItems value="#{operacaoController.itensFuncaoProduto}"/>
                        </h:selectOneMenu>

                        <h:outputText value="Fabricante: " />
                        <h:selectOneMenu id="slcFabricante" value="#{operacaoController.codFabricante}">
                            <f:selectItems value="#{operacaoController.itensFabricantes}"/>
                        </h:selectOneMenu>

                        </h:panelGrid>

                        <p:commandButton id="selectProdutoOutro" value="Finalizar"
                                     actionListener="#{operacaoController.novoProduto}"
                                     styleClass="btn_finalizar"
                                     update="@form:painelNovoProduto"
                                     oncomplete="outrodialog.hide()">
                        </p:commandButton>
                        <div class="espaco_alerta">
                            <p:messages id="mensagemNovoProduto" showDetail="true"/>
                        </div>

                    </p:panel>
              </p:dialog>

3 Respostas

fernandogodoy18

Eu utilizo isto na tag dialog

visible="#{facesContext.maximumSeverity != null}"

Pelo que eu entendi quando ocorrem mensagens de erro elas são armazenadas no facesContext e com isso ai o jsf consegue restaurar a view na fase dois do ciclo de vida.

ale0790

mesmo problema, alguem ja passou por isso?

takeshi_spoow

voce poderia fazer as verificações na ManagedBean, e definir a propriedade visible da Dialog setando um booleano de acordo com as verificações.

Ao apertar o botão você define que a dialog deve ser atualizado

abraços

Criado 1 de junho de 2010
Ultima resposta 22 de mar. de 2011
Respostas 3
Participantes 4