<p: confirmDialog> não aparece ao usar template próprio do PrimeFaces

3 respostas
MandicaBrito

Boa noite gente,

Estou desenvolvendo um trabalho com JSF 2 e primefaces 3.2 e recentemente adicionei o layout de template do próprio primefaces às minhas telas. Até aí tudo bem, mas o componente que eu tinha para confirmar a exclusão de um registro não aparece direito. Fica assim, meio que apagado e a'i acaba não habilitando os botoes para disparar os métodos devidos.

Eu testei remover a popup e chamar um botão comum, mas aí piora porque nem meu método de excluir ele encontra no meu controller.

Minha tela:
<?xml version="1.0" encoding="UTF-8" ?>
<!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:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui"
	xmlns:ui="http://java.sun.com/jsf/facelets">

<ui:decorate template="/template/home_template.xhtml">

	<ui:define name="centro">

		<h:body>
			<h:form id="formConsultarCategoria">
				<p:messages id="messages" showDetail="true" autoUpdate="true"
					closable="true" />

				<h:panelGrid columns="1">
					<h:outputLabel value="Consultar Categoria" />
					<p:separator id="separator" style="width:450px" />

					<h:outputLabel value="Nome" for="nome" />
					<p:inputText
						value="#{categoriaBean.categoriaControle.categoria.nome}"
						size="60" id="nome" readonly="true" />
				</h:panelGrid>

				<br />
				<br />
				<br />

				<h:panelGrid columns="1">
					<p:separator id="separatorButton" style="width:450px" />
				</h:panelGrid>

				<h:panelGrid columns="4">
					<p:commandButton value="Alterar"
						actionListener="#{redirecionarUtil.redirecionarCategoriaAlterar}">
					</p:commandButton>
					
					<p:commandButton value="Excluir"
						action="#{categoriaBean.categoriaControle.excluir}" ajax="false"/> // esse aqui ele nem encontra no controller
					

					<p:commandButton value="Excluir" onclick="confirmation.show()"
						type="button" /> // e a popup desse fica 'apagada' ao ser chamado

					<p:confirmDialog id="confirmDialog"
						message="Deseja realmente excluir #{categoriaBean.categoriaControle.categoria.nome}?"
						header="Confirmação de Exclusão" severity="alert"
						widgetVar="confirmation">

						<p:commandButton id="confirm" value="Sim" update="messages"
							oncomplete="confirmation.hide()"
							actionListener="#{categoriaBean.categoriaControle.excluir}" />

						<p:commandButton id="decline" value="Não"
							onclick="confirmation.hide()" type="button" />

					</p:confirmDialog>

					<p:commandButton value="Cancelar"
						actionListener="#{redirecionarUtil.redirecionarCategoriaPesquisar}" />
				</h:panelGrid>


			</h:form>
		</h:body>
	</ui:define>

</ui:decorate>
</html>
Meu controler:
@ManagedBean
public class CategoriaControle implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private EntityManager entityManager = ConfiguraJpa.getEntityManager();
	private CategoriaDAO dao = new CategoriaDAO(entityManager);

	private Categoria categoria = new Categoria();

        public void excluir() {

		entityManager.getTransaction().begin();
		dao.excluir(categoria);
		entityManager.getTransaction().commit();
		categoria = new Categoria();
		
	
	}
	
}
Meu Dao:
public class CategoriaDAO implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private GenericDAO<Categoria> dao;
    private final EntityManager entityManager;

    public CategoriaDAO(EntityManager entityManager) {
        this.dao = new GenericDAO<Categoria>(entityManager, Categoria.class);
        this.entityManager = entityManager;
    }
    
    public List<Categoria> pesquisar(Categoria categoria){
        
        String jpsql="select c from Categoria c where c.nome like :pnome order by c.id desc";
        TypedQuery<Categoria> consulta = this.entityManager.createQuery(jpsql, Categoria.class);
        
        if(categoria.getNome()==null){
            categoria.setNome("");
        }
        
        consulta.setParameter("pnome", "%"+categoria.getNome()+"%");
        
        return consulta.getResultList();
    }

    public void inserir(Categoria t) {
        dao.inserir(t);
    }

    public void alterar(Categoria t) {
        dao.alterar(t);
    }

    public void excluir(Categoria t) {
    	try{
            dao.excluir(t);
    		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Categoria: ", "Registro excluido com sucesso!"));
    	}catch (Exception e) {
    		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Não é possivel excluir Categoria. ", "Possui relações externas."));
		}
    }

    public Categoria consultar(int idClasse) {
        return dao.consultar(idClasse);
    }

    public List<Categoria> listarTodos() {
        return dao.listarTodos();
    }


	
}

Meu managedBean somente chama o controle direto.

Alguém já passou por isso? Não encontrei nada na internet que seja parecido.

Agradeço ajuda.

3 Respostas

Hebert_Coelho

Tente colocar appendToBody=“true” no seu dialog.

MandicaBrito

Oie,

Fiz como sugeriu e funcionou, obrigada :)

No entanto, reparei que a ação do botão está com um delay. Só depois do 2 ou 3 clique o método é chamado. Isso teria a ver com o layout que uso na página?

Segue meu método de excluir, na classe de controller, se ajudar:

public void excluir() {

		entityManager.getTransaction().begin();

		try {
			dao.excluir(categoria);
			entityManager.getTransaction().commit();
			categoria = new Categoria();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO, "Categoria: ",
							"Registro excluido com sucesso!"));

		} catch (Exception e) {
			entityManager.getTransaction().rollback();
			categoria = new Categoria();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Não é possivel excluir Categoria. ",
							"Possui relações externas."));
		}
	

	}
Hebert_Coelho

Não sei te falar, sorry.

Teria que analisar a estrutura de toda sua aplicação para tentar achar o problema.

Vamos ver se alguém aqui já tem alguma dica na ponta da língua né?! :smiley: :smiley: :smiley:

Criado 27 de dezembro de 2012
Ultima resposta 28 de dez. de 2012
Respostas 3
Participantes 2