Boa noite a todos, estou com a seguinte situação: tenho um p:commandButton que quando clicado deve executar um método no meu managebean pelo “evento” actionListernet e também abrir um p:dialog pelo evento onclick. A questão é que quando clico no botão o método no manage bean não é acionado, somente o evento onclick. Alguém sabe o porque? Desde já agradeço pela ajuda.
Segue as linhas de código relevantes ao problema:
botão no xhtml
<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-plus" >
<f:attribute name="tpFornecedor" value="segundo"/>
</p:commandButton>
manage bean
@SessionScoped
@ManagedBean(name="cotacaoMB")
public class CotacaoMB {
public void alterarFornecedor(ActionEvent evt){
String idFor = (String) evt.getComponent().getAttributes().get("tpFornecedor");
this.setIdFornecedor(idFor);
}
Boa noite Gabriel!
Acho que posso te ajudar com algumas dicas:
-
Já verificou se o p:commandButton está dentro de um <h:form>? Acho que precisa estar pra funcionar corretamente.
-
O p:commandButton do PrimeFaces vem por padrão com o atributo “ajax=true”, ou seja, você deveria utilizá-lo para realizar alguma funcionalidade do ajax, como renderizar componentes, etc. Você pode setar o atributo ajax=false se quiser utilizar algum processamento sem ser ajax, por exemplo, para acessar dados de um bean ou mesmo fazer a navegação forward. O própria FAQ do PrimeFaces já alerta quanto a navegação: http://www.primefaces.org/faq.html
-
Já tentou usar o <f:param> no lugar do <f:attribute>?
Outra idéia seria (acredito que vc já tenha feito…) colocar um breakpoint no início de seu método e verificar se ao clicar no botão o método é acionado, pois se for, então o problema está no método e não na view.
Espero ter ajudado.
Até +!
Boa notie vinnysoft, primeiramente obrigado pelas dicas. Respondendo as mesmas, o commandbutton está sim dentro de um h:form, vou esperiemntar criar um somente para o botão e ver o que acontece! Testei tbm setando a propriedade ajax=“false” porém o resultado foi o mesmo e o f:param segundo um outro tópico que pesquisei é utilizado para commandLink, não tenho certeza mas eles disseram isto. E eu estou monitorando sim pelo breakpoint, até mudei os botões para h:commandButton para ver o que acontece e o método foi acionado normalmente, o problema é que o h:commandButton da um submit na página, preciso impedir este submit mas ainda não sei como hehe
Olá Gabriel!
Tem como vc colocar todo o código da view para entender melhor o contexto?
Ah,
outra ideia que tive seria vc utilizar o action do p:commandButton ao invés de actionListener… Não me lembro onde li, mas me parece que um é para quando o retorno é void e o outro é para quando o retorno é uma String, ai já executaria a navegação.
Até +!
sem problemas
[code]<?xml version='1.0' encoding='UTF-8' ?>
<ui:composition template="/paginas/principais/principal.xhtml">
<ui:define name="conteudo">
<!-- INÍCIO DO FORM DE COTAÇÃO -->
<h:form id="formCotacao">
<p:outputPanel id="painelNovaCotacao">
<p:messages id="menssagens"/>
<p:dialog id="dialogo" header="Aguarde..." modal="true" widgetVar="saveDialog" closable="false" height="100" width="60"
resizable="false" appendToBody="true">
<p:ajaxStatus style="width:16px;height:16px; position: center;">
<f:facet name="start">
<h:graphicImage value="/imagens/loading.gif" style="position: center;"/>
</f:facet>
</p:ajaxStatus>
</p:dialog>
<p:panel id="painelCotacao">
<p:fieldset legend="Cotação">
<h:panelGrid columns="3" cellpadding="2">
<h:outputLabel value="Cliente"/>
<h:outputLabel value=""/>
<h:outputLabel value="Data"/>
<p:inputText id="idCliente" value="#{cotacaoMB.cotacao.cliente.pessoa.nome}" readonly="true" />
<p:commandButton onclick="selecaoCliente.show()" type="button" image="ui-icon-circle-plus"/>
<p:calendar id="idData" value="#{cotacaoMB.cotacao.dtCotacao}" navigator="true" pattern="dd/MM/yyyy" required="true" requiredMessage="Data é obrigatório!" showOn="button"/>
</h:panelGrid>
</p:fieldset>
<p:fieldset legend="Pedido 1">
<h:panelGrid columns="7" cellpadding="2">
<h:outputLabel value="Fornecedor"/>
<h:outputLabel value=""/>
<h:outputLabel value="Produto"/>
<h:outputLabel value="Valor"/>
<h:outputLabel value="Quantidade"/>
<h:outputLabel value="Frete"/>
<h:outputLabel value="Total"/>
<p:inputText id="idFornecedor" value="#{cotacaoMB.primeiroFornecedor}" readonly="true"/>
<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-circle-plus">
<f:attribute name="tpFornecedor" value="primeiro"/>
</p:commandButton>
<p:inputText id="idProduto" value="#{cotacaoMB.cotacao.produto1}" required="true" requiredMessage="Produto em Pedido 1 é obrigatório!"/>
<p:inputMask id="idValor" value="#{cotacaoMB.cotacao.valorProduto1}" mask="999999990,?00" dir="RTL" required="true" requiredMessage="Valor do produto em Pedido 1 é obrigatório!"/>
<p:inputMask id="idQuantidade" value="#{cotacaoMB.cotacao.quantidade1}" mask="999999990,?00" dir="LTR" required="true" requiredMessage=" Quantidade em Pedido 1 é obrigatório!"/>
<p:inputMask id="idFrete" value="#{cotacaoMB.cotacao.valorFrete}" mask="9999999990,?00" dir="LTR" required="true" requiredMessage="Valor do frete em Pedido 1 é obrigatório!"/>
<p:inputMask id="idTotal" value="#{cotacaoMB.cotacao.totalPedido}" mask="999999990,?00" dir="LTR" readonly="true"/>
</h:panelGrid>
</p:fieldset>
<p:fieldset legend="Pedido 2">
<h:panelGrid columns="7" cellpadding="2">
<h:outputLabel value="Fornecedor"/>
<h:outputLabel value=""/>
<h:outputLabel value="Produto"/>
<h:outputLabel value="Valor"/>
<h:outputLabel value="Quantidade"/>
<h:outputLabel value="Frete"/>
<h:outputLabel value="Total"/>
<p:inputText id="idFornecedor2" value="#{cotacaoMB.segundoFornecedor}" readonly="true"/>
<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-circle-plus" >
<f:attribute name="tpFornecedor" value="segundo"/>
</p:commandButton>
<p:inputText id="idProduto2" value="#{cotacaoMB.cotacao.produto2}" />
<p:inputMask id="idValor2" value="#{cotacaoMB.cotacao.valorProduto2}" mask="999999990,?00" dir="RTL"/>
<p:inputMask id="idQuantidade2" value="#{cotacaoMB.cotacao.quantidade2}" mask="999999990,?00" dir="LTR"/>
<p:inputMask id="idFrete2" value="#{cotacaoMB.cotacao.valorFrete2}" mask="999999990,?00" dir="LTR"/>
<p:inputMask id="idTotal2" value="#{cotacaoMB.cotacao.totalPedido2}" mask="999999990,?00" dir="RLT"/>
</h:panelGrid>
</p:fieldset>
<h:panelGrid columns="2" cellpadding="2">
<p:commandButton id="btGravar" value="Salvar" actionListener="#{cotacaoMB.gravar}" update="menssagens" onclick="saveDialog.show()" oncomplete="saveDialog.hide()" image="ui-icon ui-icon-disk"/>
<p:commandButton id="btNovo" value="Novo" type="reset" actionListener="#{cotacaoMB.limparTudo}" immediate="true" update="mensagens" image="ui-icon ui-icon-refresh"/>
</h:panelGrid>
</p:panel>
</p:outputPanel>
</h:form><!-- /formNovaCotacao -->
<!-- FORM DIALOGS -->
<h:form>
<!-- DIALOG PARA SELEÇÃO DE CLIENTE -->
<p:dialog id="selecaoClienteDialog" header="Seleção de cliente" widgetVar="selecaoCliente" height="470" width="1200"
draggable="true" resizable="false" >
<p:panel id="painelBuscarCliente" header="Buscar por" toggleable="true" >
<p:dialog id="dialogo2" header="Aguarde..." modal="true" widgetVar="saveDialog" closable="false" height="100" width="60"
resizable="false" appendToBody="true" styleClass="loadDialog" >
<p:ajaxStatus style="width:16px;height:16px; position: center;">
<f:facet name="start">
<h:graphicImage value="/imagens/loading.gif" style="position: center;"/>
</f:facet>
</p:ajaxStatus>
</p:dialog>
<p:messages id="msgPesquisa"/>
<h:panelGrid columns="5" cellpadding="2">
<h:outputLabel value="Nome: "/>
<h:outputLabel value="CPF/CNPJ: "/>
<h:outputLabel value="Logradouro: "/>
<h:outputLabel value="Cidade: "/>
<h:outputLabel value=""/>
<p:inputText id="nmClienteArg" maxlength="50" size="35" value="#{cotacaoMB.nomeClienteArg}"/>
<p:inputText id="ccClienteArg" maxlength="20" size="20" value="#{cotacaoMB.cpfCnpjClienteArg}" converterMessage="Informe somente números no campo CPF/CNPJ!"/>
<p:inputText id="logClienteArg" maxlength="50" size="35" value="#{cotacaoMB.logradouroClienteArg}"/>
<p:inputText id="cidClienteArg" maxlength="35" size="25" value="#{cotacaoMB.cidadeClienteArg}"/>
<p:commandButton id="btPesquisarCli" value="Pesquisar" image="ui-icon ui-icon-search" actionListener="#{cotacaoMB.pesquisarCliente}" update="listarClientes, msgPesquisa"
onclick="saveDialog.show()" oncomplete="saveDialog.hide()" />
</h:panelGrid>
</p:panel><!-- /painelBusca -->
<p:dataTable id="listarClientes" var="cliente" value="#{cotacaoMB.listaClientes}" paginator="true" rows="7" emptyMessage=" ">
<f:facet name="header">
Lista de clientes cadastrados
</f:facet>
<p:column headerText="Nome">
<h:outputText value="#{cliente.pessoa.nome}"/>
</p:column>
<p:column headerText="CPF/CNPJ">
<h:outputText value="#{cliente.pessoa.cpfCnpjFormatado}"/>
</p:column>
<p:column headerText="Logradouro">
<h:outputText value="#{cliente.pessoa.logradouro}"/>
</p:column>
<p:column headerText="Cidade">
<h:outputText value="#{cliente.pessoa.cidade}"/>
</p:column>
<p:column headerText="Selecione" style="width:32px">
<p:commandButton image="ui-icon ui-icon-pencil" onclick="selecaoCliente.hide()" update="formCotacao">
<f:setPropertyActionListener value="#{cliente}" target="#{cotacaoMB.cotacao.cliente}" />
</p:commandButton>
</p:column>
</p:dataTable><!-- /listaClientes -->
</p:dialog><!-- /DIALOG PARA SELEÇÃO DE CLIENTE -->
<!-- DIALOG PARA SELEÇÃO DE FORNECEDOR -->
<p:dialog id="selecaoFornecedorDialog" header="Seleção de fornecedor" widgetVar="selecaoFornecedor" height="470" width="1200"
draggable="true" resizable="false" >
<p:panel id="painelBuscarFornecedor" header="Buscar por" toggleable="true">
<p:dialog id="dialogo" header="Aguarde..." modal="true" widgetVar="saveDialog" closable="false" height="100" width="60"
resizable="false" styleClass="loadDialog" appendToBody="true">
<p:ajaxStatus style="width:16px;height:16px; position: center;">
<f:facet name="start">
<h:graphicImage value="/imagens/loading.gif" />
</f:facet>
</p:ajaxStatus>
</p:dialog>
<p:messages id="msgPesquisa2"/>
<h:panelGrid columns="4" cellpadding="2">
<h:outputLabel value="Nome: "/>
<h:outputLabel value="CPF/CNPJ: "/>
<h:outputLabel value="Atividade: "/>
<h:outputLabel value=""/>
<p:inputText id="nmForArg" maxlength="50" size="35" value="#{cotacaoMB.nomeFornecedorArg}"/>
<p:inputText id="cpfCnpjForArg" maxlength="20" size="20" value="#{cotacaoMB.cpfCnpjFornecedorArg}" converterMessage=" "/>
<h:selectOneMenu value="#{cotacaoMB.atividade}">
<f:selectItems value="#{cotacaoMB.atividades}" var="atv" noSelectionValue="Selecione" itemLabel="#{atv.descricao}" />
<f:converter converterId="cvtAtividade"/>
</h:selectOneMenu>
<p:commandButton value="Pesquisar" image="ui-icon ui-icon-search" id="btPesquisarFor" actionListener="#{cotacaoMB.pesquisarFornecedor}" update="listarFornecedores msgPesquisa2"
onclick="saveDialog.show()" oncomplete="saveDialog.hide()"/>
</h:panelGrid>
</p:panel><!-- /painelBusca -->
<p:dataTable id="listarFornecedores" var="fornecedor" value="#{cotacaoMB.listaFornecedores}" paginator="true" rows="7" emptyMessage=" ">
<f:facet name="header">
Lista de fornecedores cadastrados
</f:facet>
<p:column headerText="Nome">
<h:outputText value="#{fornecedor.pessoa.nome}"/>
</p:column>
<p:column headerText="CPF/CNPJ">
<h:outputText value="#{fornecedor.pessoa.cpfCnpjFormatado}"/>
</p:column>
<p:column headerText="Atividade">
<h:outputText value="#{fornecedor.atividade.descricao}"/>
</p:column>
<p:column headerText="Cidade">
<h:outputText value="#{fornecedor.pessoa.cidade}"/>
</p:column>
<p:column headerText="Editar" style="width:32px">
<p:commandButton image="ui-icon ui-icon-pencil" action="#{cotacaoMB.adicionarFornecedor}" onclick="selecaoFornecedor.hide()" update="formCotacao">
<f:setPropertyActionListener value="#{fornecedor}" target="#{cotacaoMB.fornecedorSelecionado}" />
</p:commandButton>
</p:column>
</p:dataTable><!-- /listaFornecedores -->
</p:dialog><!-- /DIALOG PARA SELEÇÃO DE FORNECEDOR -->
</h:form><!-- /FORM DIALOGS -->
</ui:define>
</ui:composition>
[/code]
Sim, o action deve ser utilizado quando tem navegação de página, como não estou fazendo navegação entre páginas estou usando o actionListener
Olá Gabriel!
Minhas idéias estão acabando! kkk
Outra pergunta:
-
Você está precisando que o botão executa paralelamente as duas funções: o onClick e o action? Não sei se dar pra fazer isso…
-
Os outros p:commandButtons que possuem os dois atributos setados estão funcionando?
Até +!
Você já deu uma olhada no ShowCase do PrimeFaces?
Tem um exemplo que ele usa o onClick e o actionListener: http://www.primefaces.org/showcase/ui/watermark.jsf
<p:commandButton actionListener="#{watermarkBean.search}" value="Ajax"
onclick="PrimeFaces.cleanWatermarks();" oncomplete="PrimeFaces.showWatermarks();" />
Já tentou usar no oncomplete pra ver se funciona?
Até +!
Demorei, o tempo ta curto não tive como vir antes postar a solução que adotei, mas enfim, não consegui descobri o problema de não acessar a action e resolvi da seguinte forma: troquei o p:commandButton por h:commandButton e desabilitei o ajax para não submeter o form, conforme o código a seguir.
<f:ajax disabled="false">
<h:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="/imagens/add.png" >
<f:attribute name="tpFornecedor" value="segundo"/>
</h:commandButton>
</f:ajax>
Essa era fácil.
Os botões do PrimeFaces tem por padrão ajax.
Então só coloca ali ajax=“false” e ta funcionando seu <p:commandButton.
Cya
1 curtida
Inicialmente tbm achei que o problema era desabilitar o ajax do p:commandButton, tanto é que foi a primeira coisa que fiz, porém não obtive sucesso, por isto usei o h:commandButton com ajax desabilitado.
Galera, sei que o tópico é antigo, mas outras pessoas podem se deparar com esse mesmo erro.
Aconteceu exatamente isso comigo e eu resolvi simplesmente colocando o atributo immediate=“true” no <p:commandLink/>.
Flw!
O tópico é antigo mais vou dar um “revive” nele como gears of war… rs
Bom eu enfrento o mesmo problema de todos ai em cima, fiz todas as sugestões dadas aqui e algumas outras.
Porém nada funcionou, o immediate funcionou parcialmente, mas eu tenho um objeto pessoa e com o immediate=true
ele não atualizava o form novamente, mesmo no Managedean tendo a linha pessoa = new Pessoa();
ele exibia os valores antigos.
Alguém conseguiu uma solução definitiva???
O que mais me deixa nervoso é que em outro projeto eu tenho a mesma situação, da mesma maneira, a mesma estrutura de montagem das páginas, uso templates e inserts, e neste outro projeto tudo está funcionando, sem immediate, sem mudar o ajax do commandLink ou commandButton.
Foi humilhação rs, mas para este projeto que não estava funcionando, para fazer o que queria tive que colocar dois forms, um com os inputs e outro com os commandLinks.
O commandLink executa o método, e atualiza todos os forms corretamente, se alguém conseguiu uma solução definitiva agradeço… Porque olhando os dois projetos não consegui encontrar nenhuma diferença.
Tentou colocar o ManagedBean anotado com @ViewScoped?
Saudações.
Sim, meu ManagedBean está com o ViewScoped.
Quando coloquei um form para o botão e um form para o cadastro funciona tudo normal grava no banco e etc.
O que acho mais estranho é que no outro projeto funciona. Vou tentar trocar o jar do Prime Faces.
Estou sem o código agora, mas quando chegar em casa posto o código para o pessoal.
Saudações.
Resolvi o problema, não tinha nada a ver com o ManagedBean, immediate ou ajax.
O problema estava na classe de mapaeamento do Hibernate, estava faltando um método set para uma propriedade.
Para fazer um teste tinha colocado um h:commandLink e quando ele executou a função do botão ele me retornou o erro “clase does not have a writable property”, então comecei a procurar e encontrei o método set que estava faltando. :idea: :?
Vlw pela ajuda pessoal.
[quote=Gabriel Garcia]Boa noite a todos, estou com a seguinte situação: tenho um p:commandButton que quando clicado deve executar um método no meu managebean pelo “evento” actionListernet e também abrir um p:dialog pelo evento onclick. A questão é que quando clico no botão o método no manage bean não é acionado, somente o evento onclick. Alguém sabe o porque? Desde já agradeço pela ajuda.
Segue as linhas de código relevantes ao problema:
botão no xhtml
<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick="selecaoFornecedor.show()" type="button" image="ui-icon-plus" >
<f:attribute name="tpFornecedor" value="segundo"/>
</p:commandButton>
manage bean
[code]
@SessionScoped
@ManagedBean(name=“cotacaoMB”)
public class CotacaoMB {
public void alterarFornecedor(ActionEvent evt){
String idFor = (String) evt.getComponent().getAttributes().get("tpFornecedor");
this.setIdFornecedor(idFor);
}
[/code][/quote]
[code]
Caros,
sei que já faz um tempinho mais passei pelo mesmo problema recentemente. A solução encontrada por mim foi diferente das postadas aqui, e isso me motivou a postar a solução.
Ei retirei o atributo “type=button”
ou seja
<p:commandButton actionListener="#{cotacaoMB.alterarFornecedor}" onclick=“selecaoFornecedor.show()” image=“ui-icon-plus” >
<f:attribute name=“tpFornecedor” value=“segundo”/>
</p:commandButton>[/code]
espero que seja util…vlw
eu tava com problemas com um botão simples… que só precisava esconder um Dialog…
e o maldito não funcionada… tenho em outras telas o MESMO botão… com o código exatamente igual…
e nessa tela não funcionava, nem printava erro…
<p:commandButton id="cancelButton" update=":dialogForm:infosImovelProp" icon="ui-icon-close" value="Cancelar"
oncomplete="dialogImovelPropProp.hide()" immediate="true"/>
mudei para:
<p:commandButton id="cancelButton" update=":dialogForm:infosImovelProp" icon="ui-icon-close" value="Cancelar"
onclick="dialogImovelPropProp.hide()" immediate="true"/>
onCONPLETE para onCLICK e funcionou… agora… se vc precisa realmente enviar as infos do form
eu tenho o seguinte botão…:
<p:commandButton id="createButton" update=":tabelaForm, :dialogForm:infosImovelProp" value="Adicionar" icon="ui-icon-disk"
oncomplete="if(!args.validationFailed){dialogImovelProp.hide();}" rendered="#{empty imovelPropController.imovelProp.id}"
actionListener="#{imovelPropController.adicionarImovelProp}"/>
talvez pegando como base ai nos meus botões … talvez vcs consigam algo… o/*
public void adicionarImovelProp(ActionEvent actionEvent){...}