Problemas com o confirmDialog

27 respostas
L

Olá pessoal…
Tenho um dataTable e dentro dele tenho a opção de excluir, só que antes de excluir eu quero que seja mostrado uma msg de confirmação.
Já vi vários exemplos mais ainda não dei conta de fazer funcionar. Pois quando eu confirmo a exclusão ele não altera nada na tabela.
Obs: estou usando Hibernate junto com Primefaces no Jsf.
Vai ai o código…

<h:body styleClass="corpo">
	<h:form id="formListaUsusarios">
		<center>
			<h2>Escolha uma opção</h2>
		</center>

		<p:dock position="top" maxWidth="30">
			<p:menuitem value="Novo" icon="resources/Imagens/user_into.png"
				url="usuario_cadastro.jsf" />

			<p:menuitem value="Imprimir" icon="resources/Imagens/Print.png"/>

			<p:menuitem value="Sair" icon="resources/Imagens/sair_2.png"
				url="tela_Principal.jsf" />
		</p:dock>
		<br /><br /><br />

		<p:messages />

		<p:dataTable
			id="tabela"
			value="#{usuarioBean.lista_Todos}"
			var="usuario"
			paginator="true"
			rows="5"
			paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
			widgetVar="tabela_usuarios"
			rowsPerPageTemplate="5,10,15"
			emptyMessage="Não existem usuarios cadastrado no sistema."
			cellpadding="2"
			styleClass="tabela"
			headerClass="cabecalho"
			columnClasses="primeiro, ultimo">

			<f:facet name="header">Usuarios Cadastrados</f:facet>
			<f:facet name="footer">Fim da Listagem de Usuarios</f:facet>

			<p:column id="coluna_id" style="text-align: center; width:35px;">
				<f:facet name="header">Id</f:facet>
				<h:outputText id="id" value="#{usuario.idUsuario}" />
				<p:tooltip for="id" value="Id do usuario no sistema" showEffect="fade" hideEffect="fade" />
			</p:column>

			<p:column style="text-align: center; width:100px;">
				<f:facet name="header">Status</f:facet>
				<h:commandLink id="status" action="#{usuarioBean.active}">
					<h:graphicImage library="Imagens"
						name="Status_#{usuario.status}.png" style="border:0" width="30"
						height="30" />
					<f:setPropertyActionListener target="#{usuarioBean.usuario}"
						value="#{usuario}" />
				</h:commandLink>
				<p:tooltip for="status" value="Status do usuario no sistema" showEffect="fade" hideEffect="fade" />
			</p:column>

			<p:column id="coluna_nome" sortBy="#{usuario.nome}"
				filterBy="#{usuario.nome}" style="text-align: lefth; width:250px;">
				<f:facet name="header">Nome</f:facet>
				<h:outputText value="#{usuario.nome}" />
			</p:column>

			<p:column id="coluna_email" sortBy="#{usuario.email}"
				filterBy="#{usuario.email}" style="text-align: lefth; width:250px;">
				<f:facet name="header">E-mail</f:facet>
				<h:outputText value="#{usuario.email}" />
			</p:column>

			<p:column style="text-align: lefth; width:250px;">
				<f:facet name="header">Login</f:facet>
				<h:outputText value="#{usuario.login}" />
			</p:column>

			<p:column style="text-align: lefth; width:200px;">
				<f:facet name="header">Senha</f:facet>
				<h:outputText value="#{usuario.senha}" />
			</p:column>
			
			<p:column style="text-align: center; width:80px;">
				<f:facet name="header">Nivel</f:facet>
				<h:outputText value="#{usuario.nivel}" />
			</p:column>

			<p:column style="text-align: center;">
				<f:facet name="header">Editar</f:facet>
				<h:commandLink action="#{usuarioBean.edit}">
					<h:graphicImage library="Imagens" name="TextEdit.png"
						style="border:0" width="30" height="30" />
					<f:setPropertyActionListener target="#{usuarioBean.usuario}"
						value="#{usuario}"></f:setPropertyActionListener>
					<f:setPropertyActionListener target="#{usuarioBean.destino}"
						value="listagem"></f:setPropertyActionListener>
				</h:commandLink>
			</p:column>

			<p:column style="text-align: center;">
				<f:facet name="header">Excluir</f:facet>
				<p:commandLink onclick="confirmation.show()">
					<h:graphicImage library="Imagens" name="RecycleBin1.png"
						style="border:0" width="30" height="30" />
						<f:setPropertyActionListener target="#{usuarioBean.usuario}"
						value="#{usuario}"/>
				</p:commandLink>
			</p:column>			
		</p:dataTable>					
	</h:form>
	
	<h:form id="dlg">
		<p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode"
            header="Aviso" severity="alert" widgetVar="confirmation" modal="true">
            
            <!--caso seja sim chamo o metodo excluir, e fecho o modal com o oncomplete, tenho o process que 
            estou dizendo para processar o form, e update para atualizar a tabela-->
            <p:commandButton value="Sim" action="#{usuarioBean.delete}"
            oncomplete="confirmation.hide();" ajax="false"/>
            
            <!--caso seja não somente fecha o modal-->
            <p:commandButton value="Não" onclick="confirmation.hide();" type="button" ajax="false"/>
        </p:confirmDialog>
	</h:form>
	
</h:body>

27 Respostas

E

Coloque o código na tag [code].

Já adiantando, se estiver usando a versão 3.3, está com bug no confirmDialog. Tente com a versão 3.2.
edit: falo das versões do primefaces.

L

Muito obrigado pela resposta ErickRAR;
obs: estou usando a versão 3.2 já.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui"
	xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>

	<link type="text/css" rel="stylesheet" href="resources/css/estilo.css" />

	<script type="text/javascript" src="PrimeFacesLocales.js"></script>

	<link rel="shortcut icon" href="resources/Imagens/favicon.ico"
		type="resources/Imagens/ico" />

	<title>Listagem de Usuários Cadastrados</title>
</h:head>
<h:body styleClass="corpo">
	<h:form id="formListaUsusarios">
		<center>
			<h2>Escolha uma opção</h2>
		</center>

		<p:dock position="top" maxWidth="30">
			<p:menuitem value="Novo" icon="resources/Imagens/user_into.png"
				url="usuario_cadastro.jsf" />

			<p:menuitem value="Imprimir" icon="resources/Imagens/Print.png"/>

			<p:menuitem value="Sair" icon="resources/Imagens/sair_2.png"
				url="tela_Principal.jsf" />
		</p:dock>
		<br /><br /><br />

		<p:messages />

		<p:dataTable
			id="tabela"
			value="#{usuarioBean.lista_Todos}"
			var="usuario"
			paginator="true"
			rows="5"
			paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
			widgetVar="tabela_usuarios"
			rowsPerPageTemplate="5,10,15"
			emptyMessage="Não existem usuarios cadastrado no sistema."
			cellpadding="2"
			styleClass="tabela"
			headerClass="cabecalho"
			columnClasses="primeiro, ultimo">

			<f:facet name="header">Usuarios Cadastrados</f:facet>
			<f:facet name="footer">Fim da Listagem de Usuarios</f:facet>

			<p:column id="coluna_id" style="text-align: center; width:35px;">
				<f:facet name="header">Id</f:facet>
				<h:outputText id="id" value="#{usuario.idUsuario}" />
				<p:tooltip for="id" value="Id do usuario no sistema" showEffect="fade" hideEffect="fade" />
			</p:column>

			<p:column style="text-align: center; width:100px;">
				<f:facet name="header">Status</f:facet>
				<h:commandLink id="status" action="#{usuarioBean.active}">
					<h:graphicImage library="Imagens"
						name="Status_#{usuario.status}.png" style="border:0" width="30"
						height="30" />
					<f:setPropertyActionListener target="#{usuarioBean.usuario}"
						value="#{usuario}" />
				</h:commandLink>
				<p:tooltip for="status" value="Status do usuario no sistema" showEffect="fade" hideEffect="fade" />
			</p:column>

			<p:column id="coluna_nome" sortBy="#{usuario.nome}"
				filterBy="#{usuario.nome}" style="text-align: lefth; width:250px;">
				<f:facet name="header">Nome</f:facet>
				<h:outputText value="#{usuario.nome}" />
			</p:column>

			<p:column id="coluna_email" sortBy="#{usuario.email}"
				filterBy="#{usuario.email}" style="text-align: lefth; width:250px;">
				<f:facet name="header">E-mail</f:facet>
				<h:outputText value="#{usuario.email}" />
			</p:column>

			<p:column style="text-align: lefth; width:250px;">
				<f:facet name="header">Login</f:facet>
				<h:outputText value="#{usuario.login}" />
			</p:column>

			<p:column style="text-align: lefth; width:200px;">
				<f:facet name="header">Senha</f:facet>
				<h:outputText value="#{usuario.senha}" />
			</p:column>
			
			<p:column style="text-align: center; width:80px;">
				<f:facet name="header">Nivel</f:facet>
				<h:outputText value="#{usuario.nivel}" />
			</p:column>

			<p:column style="text-align: center;">
				<f:facet name="header">Editar</f:facet>
				<h:commandLink action="#{usuarioBean.edit}">
					<h:graphicImage library="Imagens" name="TextEdit.png"
						style="border:0" width="30" height="30" />
					<f:setPropertyActionListener target="#{usuarioBean.usuario}"
						value="#{usuario}"></f:setPropertyActionListener>
					<f:setPropertyActionListener target="#{usuarioBean.destino}"
						value="listagem"></f:setPropertyActionListener>
				</h:commandLink>
			</p:column>

			<p:column style="text-align: center;">
				<f:facet name="header">Excluir</f:facet>
				<p:commandLink onclick="confirmation.show()">
					<h:graphicImage library="Imagens" name="RecycleBin1.png"
						style="border:0" width="30" height="30" />
						<f:setPropertyActionListener target="#{usuarioBean.usuario}"
						value="#{usuario}"/>
				</p:commandLink>
			</p:column>			
		</p:dataTable>					
	</h:form>
	
	<h:form id="dlg">
		<p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode"
            header="Aviso" severity="alert" widgetVar="confirmation" modal="true">
            
            <!--caso seja sim chamo o metodo excluir, e fecho o modal com o oncomplete, tenho o process que 
            estou dizendo para processar o form, e update para atualizar a tabela-->
            <p:commandButton value="Sim" action="#{usuarioBean.delete}"
            oncomplete="confirmation.hide();" ajax="false"/>
            
            <!--caso seja não somente fecha o modal-->
            <p:commandButton value="Não" onclick="confirmation.hide();" type="button" ajax="false"/>
        </p:confirmDialog>
	</h:form>
	
</h:body>
</html>
E

Tente retirando o “ajax=false” e atualizando o outro form:

<p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode"  
            header="Aviso" severity="alert" widgetVar="confirmation" modal="true">  
              
            <!--caso seja sim chamo o metodo excluir, e fecho o modal com o oncomplete, tenho o process que   
            estou dizendo para processar o form, e update para atualizar a tabela-->  
            <p:commandButton value="Sim" action="#{usuarioBean.delete}"  
            oncomplete="confirmation.hide();" update=":formListaUsusarios" />  
              
            <!--caso seja não somente fecha o modal-->  
            <p:commandButton value="Não" onclick="confirmation.hide();" type="button" />  
        </p:confirmDialog>

Se não funcionar, troque de action para actionListener. Não deve ter diferença nesse caso, mas é como está no exemplo do primefaces.

L

Ainda não deu certo…
Fiz alguns testes ele percorre todos os metodos que tem que percorrer mais não faz nada no banco.

Me retorna esta msg:
Dentro do delete
Dentro do URN Excluir - é uma classe com regras do negocio, somente passa por ela no caso de excluir.
Dentro do Dao deletar
Jul 24, 2012 9:01:23 PM org.hibernate.event.internal.DefaultDeleteEventListener deleteTransientEntity
INFO: HHH000114: Handling transient entity in delete processing

E

Poste os métodos do usuarioBean e o do banco para deletar.

L
public String delete() {
		System.out.println("Dentro do delete");
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.excluir(usuario);
		lista_Todos = null;
		return null;
	}

public void excluir(Usuario usuario){
		System.out.println("Dentro do URN Excluir");
		usuarioDAO.deletar(usuario);
	}

public void deletar(Usuario usuario) {
		System.out.println("Dao deletar");
		session.delete(usuario);
	}
E

Tá dando commit na transação em algum lugar?

L

Uso esta classe para fazer isto.

package br.com.Ipbc.web.filter;

import javax.servlet.*;
import org.hibernate.SessionFactory;

import br.com.Ipbc.Util.HibernateUtil;


public class HibernateSessionRequestFilter implements Filter {

	private SessionFactory sf;

	public void init(FilterConfig config) throws ServletException {
		sf = HibernateUtil.getSF();
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws ServletException {
		try {
			sf.getCurrentSession().beginTransaction();
			chain.doFilter(request, response);
			sf.getCurrentSession().getTransaction().commit();
			sf.getCurrentSession().close();
		}catch (Throwable e) {
			try {
				if (sf.getCurrentSession().getTransaction().isActive()) {
					sf.getCurrentSession().getTransaction().rollback();
				}
				
			} catch (Throwable e2) {
				e2.printStackTrace();
			}
			throw new ServletException(e);
		}
	}

	public void destroy() {
	}
}
L

Só lembrando funciona legal sem a msg de confirmação.

E

Então deve ser algum bug do primefaces mesmo, pois o resto parece estar correto.
Mas você pode fazer o seu proprio “confirmdialog”. Só criar um dialog com dois botoes, um para confirmar e outro para cancelar.

L

To pirando com isso já tem quatro dias e não da certo…
Devo usar uma outra versão então?

L

tem um exemplo ai?
Sou novo em web…

E
<p:commandButton title="Deletar" update=":dialogForm" icon="trash"
					onclick="dialogWidget.show();">
					<f:setPropertyActionListener value="#{usuario}"
						target="#{usuarioBean.usuario}" />
				</p:commandButton>


//E o seu dialog

<p:dialog widgetVar="dialogWidget" id="dialogID" showEffect="slide"
		modal="true" closable="true" draggable="false" resizable="false">
		<h:form id="dialogForm">
			<p:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">
				
				<p:commandButton actionListener="#{usuarioBean.delete}"
					value="Sim" update=":formListaUsusarios"
                                                                     onclick="dialogWidget.hide()"
					icon="ui-icon-check" />
                                                   <p:commandButton 
					value="#Não"      onclick="dialogWidget.hide()"
					icon="ui-icon-closethick" />

			</p:panelGrid>

		</h:form>
	</p:dialog>
L

Ok vou ver aqui…
ErickRAR do jeito que vc me passou eu coloquei e não ta dando certo.
Devo colocar fora do outro form mesmo? Ou dentro dele?

E

Fora do outro form, e o commandButton dentro do dataTable com a lista de usuários.

L

Dentro não da certo também…

L

Não deu certo…
Nem sei mais o que fazer…

L

É meu amigo ErickRAR na versão 2.2.1 do primefaces ele não aceita o <f:setPropertyActionListener/>.
To perdido…

O mais interessante é que quando eu chamo o método delete dentro do dataTable da certo;
Mais quando tem que confirmar da errado.

E

Não pode atualizar a versão para 3.2?

L

Estou com a 3.2, será que a ultima como vc disse não daria certo?

E

Tente também. Eu tenho a versão 3.3 aqui, e meu confirmDialog é parecido com esse abaixo. Ele não funciona nessa versão, mas se eu alterar para 3.2,funciona normalmente.

<p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode"    
            header="Aviso" severity="alert" widgetVar="confirmation" modal="true">    
                
            <!--caso seja sim chamo o metodo excluir, e fecho o modal com o oncomplete, tenho o process que     
            estou dizendo para processar o form, e update para atualizar a tabela-->    
            <p:commandButton value="Sim" actionListener="#{usuarioBean.excluir}"    
            oncomplete="confirmation.hide();" update=":formListaUsusarios" />    
                
            <!--caso seja não somente fecha o modal-->    
            <p:commandButton value="Não" onclick="confirmation.hide();" type="button" />    
        </p:confirmDialog>

E no bean:

import javax.faces.event.ActionEvent;
...
public void excluir(ActionEvent actionEvent){
		try {
		UsuarioRN usuarioRN = new UsuarioRN();  
        usuarioRN.excluir(usuario);  
			
		} catch (Exception e) {
			
		}
	}
L

Será que o problema esta no hibernate?
Como já disse ele percorre todos os metodos mas não faz nada no banco.
Mas não é não sem confirmar deleta normal…

L

Então ErickRAR o que me dizes…
Tentei de tudo que sei e não deu certo.
Será que tenho que fazer na unha mesmo?

L

Pelo que to vendo tem muitos com este problema.
Estive pesquisando aki no guj e encontrei muitos com o mesmo dilema mas nenhum chegou a uma solução.
Acho que não foi uma boa escolha de frame…

E

Veja no fórum deles se há alguma coisa.

L

E ai colega…
Kara to sem saber o que fazer com esse problema.

L

Amigos ainda estou com o mesmo problema…
Alguém pode me ajudar?

Criado 23 de julho de 2012
Ultima resposta 28 de ago. de 2012
Respostas 27
Participantes 2