Problemas com collector JSF2 + Primefaces

3 respostas
Polverini

Bom dia pessoal,

Estou com um problema no collector do primefaces, na data table abaixo não consigo excluir o item um a um, quando clico no link remover ele apaga todos os itens, uso o bean com ViewScoped, eu uso um form dentro de outro, esses dados ainda não estão gravados em banco estão na lista a espera do comando para salvar, abaixo da data table eu vou inserir a parte do código que insere as parcelas na lista.

DataTable

<div align="center">
                        <h:form prependId="false">
                            <h:panelGrid columns="1" style="width: 60%" id="pg_tbl">

                                <p:dataTable var="parcela" value="#{autorizacaoBean.listParcela}" 
                                             emptyMessage="Nenhuma Parcela Cadastrada !" 
                                             style="width: 100%; text-align: center">
                                    <p:column style="width: 15%">
                                        <f:facet name="header">
                                            <h:outputLabel value="Data de Pagamento"/>
                                        </f:facet>
                                        <h:outputLabel value="#{parcela.data}">
                                            <f:convertDateTime pattern="dd/MM/yyyy"/>
                                        </h:outputLabel>
                                    </p:column>
                                    <p:column style="width: 18%">
                                        <f:facet name="header">
                                            <h:outputLabel value="Valor R$"/>
                                        </f:facet>
                                        <h:outputLabel value="#{parcela.valor}">
                                            <f:convertNumber minIntegerDigits="1" minFractionDigits="2" maxFractionDigits="2"/>
                                        </h:outputLabel>
                                    </p:column>
                                    <p:column style="width: 5%">
                                        <f:facet name="header">
                                            <h:outputLabel value="Excluir"/>
                                        </f:facet>
                                        <p:commandLink value="Remover" update="pg_tbl">  
                                            <p:collector value="#{parcela}"  
                                                         removeFrom="#{autorizacaoBean.listParcela}" />  
                                        </p:commandLink>  
                                    </p:column>
                                </p:dataTable>
                                <br/>
                                &lt;h:outputLabel value="Previsão de Gasto #{autorizacaoBean.total}"&gt;
                                    &lt;f:convertNumber minIntegerDigits="1" minFractionDigits="2" maxFractionDigits="2"/&gt;
                                &lt;/h:outputLabel&gt;
                            &lt;/h:panelGrid&gt;
                        &lt;/h:form&gt;
                    &lt;/div&gt;

Inserção na lista (form separado)

&lt;h:form prependId="false" id="parcela"&gt;
            &lt;p:dialog widgetVar="inserePag" header="Incluir Pagamento!" showEffect="clip" hideEffect="clip" width="350"&gt;
                &lt;div id="inserirbotao" align="center"&gt;
                    &lt;h:panelGrid columns="2" style="text-align:left"&gt;
                        &lt;h:outputLabel value="Valor: "/&gt;
                        &lt;p:inputText value="#{autorizacaoBean.parcela.valor}" required="true" requiredMessage="Informe o valor da parcela !"&gt;
                            &lt;f:convertNumber minFractionDigits="2" maxFractionDigits="2" minIntegerDigits="1" /&gt;
                        &lt;/p:inputText&gt;
                        &lt;h:outputLabel value="Data de Pagamento: "/&gt;
                        &lt;p:calendar value="#{autorizacaoBean.parcela.data}" pattern="dd/MM/yyyy" autocomplete="true" effect="fold"
                                    required="true" requiredMessage="Informe a data de pagamento !" showOn="button" navigator="true"
                                    mindate="#{filaBean.dataHoje}"/&gt;
                    &lt;/h:panelGrid&gt;
                    &lt;p:commandButton  update="growl pg_tbl parcela" value="Inserir" oncomplete="inserePag.hide()" action="#{autorizacaoBean.addParcela}"&gt;
                        &lt;p:collector value="#{autorizacaoBean.parcela}" addTo="#{autorizacaoBean.listParcela}"/&gt;
                    &lt;/p:commandButton&gt;
                &lt;/div&gt;
            &lt;/p:dialog&gt;
        &lt;/h:form&gt;

no log do tomcat7 aparece a seguinte menssagem :

24/03/2011 11:41:27 org.apache.tomcat.util.http.Parameters processParameters
INFO: Parameters: Invalid chunk '' ignored.

p/s sem ajax funciona

3 Respostas

F

Bom dia amigo,

Consegui adicionado [ajax="false"] no p:commandLink.

<p:commandLink value="Remover" update="form:fichaProdutos" process="@parent" ajax="false" > <p:collector value="#{fichaProduto}" removeFrom="#{fichaBean.fichaProdutos}" /> </p:commandLink> </p:column>

Estou tendo problemas com o controle p:collector que não está adicionado items corretamente a lista (adiciona apenas um item), poderia postar o seu código do método 'autorizacaoBean.addParcela' ?

Estou utilizando da seguinte forma:

Bean:

public String addFichaPodutos() { fichaProduto = new FichaProduto(); return null; }

XHTML :

<p:commandButton value="Reset" type="reset"/> <p:commandButton value="Add" update="fichaProdutos msgs @parent" action="#{fichaBean.addFichaPodutos}" > <p:collector value="#{fichaBean.fichaProduto}" addTo="#{fichaBean.fichaProdutos}" /> </p:commandButton>

A Bean já está com escopo de Sessão, mas mesmo assim somente é adicionado um item ao p:dataTable.
flaviochess

Apesar do post já ser de alguns meses atrás… sempre haverá pessoas procurando por isso, então respondendo a pergunta do fclmrj: Estou enfrentando os mesmos problemas, quanto a questão do adicionar eu retirei a tag collector do commandButton (no seu caso):

<p:commandButton value="Add" update="fichaProdutos msgs @parent" action="#{fichaBean.addFichaPodutos}"  />

e adicionando na lista através do método add…

public String addFichaPodutos() {
     fichaProdutos.add(fichaProduto);
     fichaProduto = new FichaProduto();
     return null;
}
F

Olá a todos !

Faz tempo que finalizei este projeto, mas vamos lá ! resolvi da seguinte forma :
<h:form id="form">          

            .
            .
            .
                        <p:commandButton value="Reset" type="reset"/>  
                        <p:commandButton value="Add" update=":form msgs totalProdutos totalFicha"  
                                         action="#{fichaBean.addFichaProdutos}"  >  
                            <p:collector value="#{fichaBean.fichaProduto}"   
                                         addTo="#{fichaBean.fichaProdutos}" />  
                        </p:commandButton>  
                    </h:panelGrid>  
                </p:panel> 

                <p:separator /> 

                <p:outputPanel id="fichaProdutos">  
                    <p:dataTable value="#{fichaBean.fichaProdutos}" var="fichaProduto">  

                        <p:column>  
                            <f:facet name="header">  
                                <h:outputText value="Funcionário" />  
                            </f:facet>  
                            <h:outputText value="#{fichaProduto.cod_funcionario}" />  
                        </p:column>  
                        
              .
              .
              .
Atenção a String ':form' do Parâmetro 'update' da tag '<p:commandButton'. Quando o ajax é chamado pelo commandButton no click, atualiza todo o 'form'. Confesso não ter entendido muito bem esta lógica porque a tag '<p:collector' deveria por sí só adicionar o objeto a lista. Digo isso porque tambem foi preciso adicionar o objeto a lista no evento fichaBean.addFichaProdutos chamado como a seguir :
public String addFichaProdutos() {

            List<FichaProduto> lstFichaProdutos = new ArrayList<FichaProduto>();

            lstFichaProdutos = ficha.getFichaProdutos();

            FichaProduto fp = new FichaProduto();
            fp = fichaProduto;
            lstFichaProdutos.add(fp);

            fichaProduto = new FichaProduto();

            ficha.setFichaProdutos(lstFichaProdutos); 
        }
<managed-bean>
        <managed-bean-name>fichaBean</managed-bean-name>
        <managed-bean-class>sistema.bean.FichaBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
Mas pelo menos a questão "adicionar apenas um item" foi solucionada.
Criado 24 de março de 2011
Ultima resposta 28 de jan. de 2012
Respostas 3
Participantes 3