Problemas com commandLink do Primefaces

Tenho um tela de cadastro de usuários e no dataTable, quero adicionar um ícone na linha do usuário para abrir um confirmDialog perguntando se deseja mesmo resetar a senha. Se sim, aí chamo o método para resetar. O que eu tenho até agora:

A princípio eu tinha pensado em “copiar” a ideá de um outro botão na linha que seta os valores do usuário no panel, e aí, por cima abriria o confirmDialog, porém, não estava utilizando o commandLink do Primefaces, estava utilizando do HTML.

<p:column headerText="Resetar" scrollable="true" width="40"
	rendered="#{usuarioLogadoBean.usuario.tipo eq 'Gerencial'}">
	<h:commandLink id="resetA">
		<p:graphicImage name="imagens/key.png" />
		<f:setPropertyActionListener value="#{usuario}"
			target="#{usuarioBean.usuario}" />
		<f:ajax render=":formUsuario" />
	</h:commandLink>
</p:column>

Desta maneira, ele preenche o panel com os dados, aí tentei alterar para abrir o confirmDialog, só consegui assim:

<p:commandLink id="resetA" target="#{usuarioBean.usuario}"
	process="@this" update=":formUsuario" action="#{usuarioBean.grava()}">
	<p:graphicImage name="imagens/key.png" />
	<p:confirm header="Resetar senha"
		message="Deseja mesmo resetar a senha?" />
</p:commandLink>							

a tag confirm do Primefaces chama o confirmDialog abaixo:

<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
	<h:commandButton value="Sim" styleClass="ui-confirmdialog-yes" />
	<h:commandButton value="Não" styleClass="ui-confirmdialog-no" />
</p:confirmDialog>					

aí até abre, o diálogo certinho, mas, como faço para poder “passar” os valores para o meu método de resetar pegando os dados do usuário na linha?

Aqui você encontra 4 maneiras de passar parâmetros do xhtml para o bean.
Partindo daí você pode pensar no seguinte:

  • Você tem um CRUD para o objeto em questão? Se sim, possui um método que, a partir de um identificador (como o código do usuário) consegue retornar os dados do usuário cadastrado? Se sim, então você pode utilizar uma das quatro formas sugeridas no link que passei e, partindo daí, transmitir o id do usuário e recuperá-lo no bean. Depois, realiza a busca pelo usuário com base no id recuperado e pronto, tem os dados do usuário específico.

##Faz o seguinte:

Exemplo utilizando uma string

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class UsuarioBean {        
    private String usuarioSelecionado;
    /**
     * Isso vai ser a action do seu 
     * p:commandLink = #{usuarioBean.selecionar(usuario)}
     * @param usuario
     */
    public void selecionar(String usuario) {
        this.usuarioSelecionado = usuario;
    }        
    public String getUsuarioSelecionado() {
        return usuarioSelecionado;
    }
    public void setUsuarioSelecionado(String usuarioSelecionado) {
        this.usuarioSelecionado = usuarioSelecionado;
    }        
}

Com essa estrategia não vai precisar utilziar:

<f:setPropertyActionListener value="#{usuario}" target="#{usuarioBean.usuario}" />

Lembre de processar o datatable que possui a linha do usuário:

<p:commandLink action="#{usuarioBean.selecionar(usuario)}"
                      value="TESTE" 
                      process="@form:dataTable" />	

No seu dialog você deve utilizar as informações do usuarioSelelcionado para realizar a alteração.

Espero que essas informações ajude em algo.

1 curtida

Meu caro, obrigado!

Deu certo seguindo o seu exemplo, que por sinal, também pode ser feito como o colega abaixo menciona.

Só para constar, vou postar como ficou:

<p:commandLink id="resetA"
	action="#{usuarioBean.resetaSenhaUsuario()}">
	<p:graphicImage name="imagens/key.png" />
	<f:setPropertyActionListener value="#{usuario}"
		target="#{usuarioBean.usuario}" />
	<p:confirm header="Resetar senha"
		message="Deseja mesmo resetar a senha?" />
</p:commandLink>

Novamente agradeço pela força!

Salvou a minha “pátria” novamente. hehehehehehehe.

1 curtida

Weverton, obrigado!

No exemplo que o drsmachado passou, uma das 4 maneiras é exatamente a sua, testei aqui e só não consegui entender como passar no confirmDialog os valores do usuarioSelecionado.

A ideia achei bastante prática, em outro momento, quando eu não estiver “tão” apertado, tento novamente.

Agradeço pela força.

Abraço!

1 curtida

Olá Calera,

Seria algo desse tipo:

(Alguns campos retirados para facilitar o exemplo)

<p:dialog header="Formulário de Usuário">
	<h:panelGrid columns="3" cellspacing="5">

	    <h:outputText value="Campo 1: " />
	    <p:inputText value="#{usuarioBean.usuarioSelecionado.atributo1}"/>

	    <h:outputText value="Campo 2: " />
	    <p:inputText value="#{usuarioBean.usuarioSelecionado.atributo2}"/>
				
	</h:panelGrid>
	<f:facet name="footer">
	   <p:commandButton value="Acao" action="#{usuarioBean.fazerMinhaAcao()}" />
	</f:facet>	
</p:dialog>
1 curtida