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

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 <p:confirmDialog> 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:

[code]<?xml version="1.0" encoding="UTF-8" ?>

<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>

[/code]

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.

Tente colocar appendToBody=“true” no seu dialog.

Oie,

Fiz como sugeriu e funcionou, obrigada :slight_smile:

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:

[code]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."));
	}


}

[/code]

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: