Problemas com argumentos de pesquisa no <p:inputText> dentro do <p:dialog> JSF2 + PrimeFaces

5 respostas
G

Boa noite a todos, tenho a seguinte situação: tenho um cadastro de cotação onde o usuário pode clicar no botão [+] para adicionar um cliente. Esse botão abre um dialog onde ele faz uma pesquisa e os clientes são listados em uma dataTable para que ele possa selecionar o cliente que deseja adicionar na cotação. Quando clico em pesquisar sem informar os argumentos todos os clientes são pesquisados e listados, porém quando algum argumento é informado, as variáveis referentes aos argumentos em meu ManageBean não são populadas (todos os getts e sets foram criados corretamente), sendo assim a cláusua where do meu select não vai existir. Talvez seja algo relacionado aos forms, não sei ao certo até porque não consegui identificar mas o caso é que os argumentos não estão sendo setados!! Desde já agradeço pela ajuda e segue os códigos:

novaCotacao.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition 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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.prime.com.tr/ui">
	
	<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">
						<h:form>
							<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>
						</h:form>
					</p:dialog>		
					<p:panel>
						<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-plus" title="Icon Only"/>
								<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="Produto"/>
								<h:outputLabel value="Valor"/>
								<h:outputLabel value="Quantidade"/>
								<h:outputLabel value="Frete"/>
								<h:outputLabel value="Fornecedor"/>
								<h:outputLabel value=""/>
								<h:outputLabel value="Total"/>
								<p:inputText id="idProduto" value="#{cotacaoMB.cotacao.produto1}" required="true" requiredMessage="Produto em Produto 1 é obrigatório!"/>
								<p:inputMask id="idValor" value="#{cotacaoMB.cotacao.valorProduto1}" mask="999999990,?00" dir="RTL" required="true" requiredMessage="Valor do produto em Produto 1 é obrigatório!"/>
								<p:inputMask id="idQuantidade" value="#{cotacaoMB.cotacao.quantidade1}" mask="999999990,?00" dir="LTR" required="true" requiredMessage=" Quantidade em Produto 1 é obrigatório!"/>
								<p:inputMask id="idFrete" value="#{cotacaoMB.cotacao.valorFrete}" mask="[telefone removido],?00" dir="LTR" required="true" requiredMessage="Valor do frete em Produto 1 é obrigatório!"/>
								<p:inputText id="idFornecedor" value="#{cotacaoMB.primeiroFornecedor}" readonly="true"/>
								<p:commandButton onclick="selecaoFornecedor.show()" type="button" image="ui-icon-plus"/>
								<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="Produto"/>
								<h:outputLabel value="Valor"/>
								<h:outputLabel value="Quantidade"/>
								<h:outputLabel value="Frete"/>
								<h:outputLabel value="Fornecedor"/>
								<h:outputLabel value=""/>
								<h:outputLabel value="Total"/>
								<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:inputText id="idFornecedor2" value="#{cotacaoMB.segundoFornecedor}" readonly="true"/>
								<p:commandButton onclick="selecaoFornecedor.show()" type="button" image="ui-icon-plus"/>
								<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" 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" appendToBody="true" 
					height="550" width="1200" draggable="false" resizable="false" modal="true" styleClass="posicaoDialog">
					<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">								
								<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="mensagensBusca"/>
						<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="editPesNome" maxlength="50" size="35" value="#{cotacaoMB.nomeClienteArg}"/>
							<p:inputText id="editPesCpfCnpj" maxlength="20" size="20" value="#{cotacaoMB.cpfCnpjClienteArg}" converterMessage="Informe somente números no campo CPF/CNPJ!"/>
						  	<p:inputText id="editPesLogradouro" maxlength="50" size="35" value="#{cotacaoMB.logradouroClienteArg}" />
							<p:inputText id="editPesCidade" maxlength="35" size="25" value="#{cotacaoMB.cidadeAClienteArg}"/>
							<p:commandButton value="Pesquisar" image="ui-icon ui-icon-search" id="btPesquisarCli" actionListener="#{cotacaoMB.pesquisarCliente}" update="listarClientes, mensagensBusca" 
								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="Nenhum registro encontrado!">
						<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()">
					            <f:setPropertyActionListener value="#{cliente}" target="#{cotacaoMB.cotacao.cliente}" />
					        </p:commandButton>
						</p:column>				         
					</p:dataTable><!-- /listaClientes -->			
				</p:dialog><!-- /DIALOG PARA SELEÇÃO DE CLIENTE -->			
			</h:form><!-- /FORM DIALOGS -->			
		</ui:define>
	</ui:composition>
</html>

CotacaoMB.java

package br.com.gpa.controller;

import java.util.ArrayList;

@SessionScoped
@ManagedBean(name="cotacaoMB")
public class CotacaoMB {
	
	private Cotacao cotacao;
	private ClienteBO clienteBO;
	private List<Cliente> listaClientes;
	private List<Fornecedor> fornecedores;
	private String primeiroFornecedor;
	private String segundoFornecedor;
	//argumentos de pesquisa do cliente
	private String nomeClienteArg;
	private Long cpfCnpjClienteArg;
	private String logradouroClienteArg;
	private String cidadeClienteArg;
	
	public CotacaoMB(){
		this.cotacao = new Cotacao();
		this.clienteBO = new ClienteBO();
		this.listaClientes = new ArrayList<Cliente>();
		this.fornecedores = new ArrayList<Fornecedor>();
	}
	
	public void pesquisarCliente(){
		Cliente cli = new Cliente();
		cli.setPessoa(new Pessoa());
		cli.getPessoa().setNome(getNomeClienteArg());
		if(getCpfCnpjClienteArg() != null && getCpfCnpjClienteArg() != 0)
			cli.getPessoa().setCpfCnpj(getCpfCnpjClienteArg());
		else
			setCpfCnpjClienteArg(null);
		cli.getPessoa().setLogradouro(getLogradouroClienteArg());
		cli.getPessoa().setCidade(getCidadeClienteArg());
		this.setListaClientes(clienteBO.recuperaClientesPorParametros(cli));
		if(listaClientes.isEmpty())
			FacesContextUtil.mensagemAtencao("Nenhum registro encontrado para os dados informado!");
	}
	
		
	public void gravar(){
		System.out.println();
	}
	
	public void limparTudo(){
		System.out.println();
	}

	public void setPrimeiroFornecedor(String primeiroFornecedor) {
		this.primeiroFornecedor = primeiroFornecedor;
	}
	
	public String getPrimeiroFornecedor(){
		if(this.getFornecedores() != null && !this.getFornecedores().isEmpty())
			return fornecedores.get(0).getPessoa().getNome();
		else
			return "";
	}
	
	public void setSegundoFornecedor(String segundoFornecedor) {
		this.segundoFornecedor = segundoFornecedor;
	}
	
	public String getSegundoFornecedor(){
		if(this.getFornecedores() != null && !this.getFornecedores().isEmpty())
			return fornecedores.get(1).getPessoa().getNome();
		else
			return "";
	}
		
	public void setCotacao(Cotacao cotacao) {
		this.cotacao = cotacao;
	}

	public Cotacao getCotacao() {
		return cotacao;
	}

	public void setFornecedores(List<Fornecedor> fornecedores) {
		this.fornecedores = fornecedores;
	}

	public List<Fornecedor> getFornecedores() {
		return fornecedores;
	}
	
/*	public String getNomeCliente(){
		if(this.getCliente() != null && this.getCliente().getPessoa() != null)
			return this.getCliente().getPessoa().getNome();
		else
			return "";
	}*/

	public void setListaClientes(List<Cliente> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<Cliente> getListaClientes() {
		return listaClientes;
	}

	public String getNomeClienteArg() {
		return nomeClienteArg;
	}

	public void setNomeClienteArg(String nomeClienteArg) {
		this.nomeClienteArg = nomeClienteArg;
	}

	public Long getCpfCnpjClienteArg() {
		return cpfCnpjClienteArg;
	}

	public void setCpfCnpjClienteArg(Long cpfCnpjClienteArg) {
		this.cpfCnpjClienteArg = cpfCnpjClienteArg;
	}

	public String getLogradouroClienteArg() {
		return logradouroClienteArg;
	}

	public void setLogradouroClienteArg(String logradouroClienteArg) {
		this.logradouroClienteArg = logradouroClienteArg;
	}

	public void setCidadeClienteArg(String cidadeClienteArg) {
		this.cidadeClienteArg = cidadeClienteArg;
	}

	public String getCidadeClienteArg() {
		return cidadeClienteArg;
	}
	
}

[b]OBS.: linha dos argumentos da pesquisa (no xhtml): 101 a 103; linha do botão que aciona o método do manageBean: 104
Palavras chave: Arg, pesquisarCliente
[b]

5 Respostas

B

cara, tambem estou com este problema…
no meu caso estou usando uma gambiarra para resolver…
no meu <p:inputText> eu coloco um ajax de evento keyup

<p:inputText name="busca" value=#{bean.nome}>
     <p:ajax event="keyup"/>
</p:inputText >

…com esse ajax ele consegue preenche o managed bem normal…

o problema é que se vc utilizar o ajax status na pagina vai atrapalhar essa gambi…
xD

J

Indique quais components serão enviados ao servidor no momento da requisição ajax com o atributo process do component <p:commandButton.
Ex.: process="@this, editPesNome".
flw!

G

Boa tarde galera, vim agradecer pelas respostas. Ando com pouco tempo mas sempre que da eu venho colocar um retorno, apesar de ainda não ter implementado as sugestões que me deram, assim que eu implementar coloco aqui o resultado! Abraço

G

Bom apliquei o que vocês sugeriram mas meus atributos em meu manage bean continuam não sendo populados, alguém mais tem alguma ideia?

G

Descobri que o problema está relacionado a propriedade appendToBody=“true” do dialog, que utilizei para resolver outro problema do dialog que é o modal=“true”, já que sem colocar o appendToBody ele fica escondido abaixo do modal! Complicado, alguém sabe como trazer o dialog a frente do modal ? Já tentei com zindex e criar form só para ele. Ou então como fazer para popular os atributos do managebean com a tag appendToBody=“true”, conforme o problema relatado no início do tópico.

Criado 26 de outubro de 2011
Ultima resposta 31 de out. de 2011
Respostas 5
Participantes 3