Pessoal, tenho um datatable que lista notificações. Eu queria que fosse possível detalhar cada notificação em uma outra página.
Como cada linha da lista tem um ID, quero pegá-lo e utilizá-lo na datatable da outra página.
Eu pego o ID da linha assim:
<p:dataTable id="notifs" var="search" value="#{searchBean.listSymptom}" rendered="#{!empty searchBean.listSymptom}">
<p:column>
<c:facet name="header">
<h:outputText value="ID" />
</c:facet>
<h:link outcome="showIndNotifSearch" value="#{search.code}">
<c:param name="code" value="#{search.code}" />
</h:link>
</p:column>
</p:dataTable>
A próxima página(showIndNotifSearch.xhtml) está assim:
<c:view>
<c:metadata>
<c:viewParam name="code" id="code" value="#{searchBean.selected.code}"></c:viewParam>
</c:metadata>
</c:view>
<h:form id="texto" styleClass="centered">
<h:outputText value="#{searchBean.selected.code}" /> <!-- imprime o valor do code -->
<p:dataTable id="notifs" var="cli" value="#{clinDataBean.listDataNotifSearch}" >
</p:dataTable>
Meu bean tem isso:
public List<ClinData> getListDataNotifSearch() {
if (this.listDataNotifSearch == null) {
ClinDataRN clinDataRN = new ClinDataRN();
this.listDataNotifSearch = clinDataRN.listDataNotifSearch();
}
return this.listDataNotifSearch;
}
Eu gostaria de saber se tem como eu pegar esse code e utilizá-lo no meu método listDataNotifSearch() do meu Bean.
Eu já tentei fazer da seguinte forma, mas não funciona:
<p:dataTable id="notifs" var="cli" value="#{clinDataBean.listDataNotifSearch(code)}" >
</p:dataTable>
e o Bean:
public List<ClinData> getListDataNotifSearch(Integer code) {
if (this.listDataNotifSearch == null) {
ClinDataRN clinDataRN = new ClinDataRN();
this.listDataNotifSearch = clinDataRN.listDataNotifSearch(code);
}
return this.listDataNotifSearch;
}
Agradeço desde já por qualquer ajuda. =)
Pelo que entendi, você quer conseguir recuperar o objeto de uma linha clicada no seu datatable e seta-la no seu bean ?? É isso ?
Caso seja isso, dá uma olhada nesse link do showcase do primefaces : http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf
<p:dataTable ... var="car" selection="#{tableBean.selectedCar}" selectionMode="single">
<p:ajax event="rowSelect" listener="#{tableBean.onRowSelect}" >
...
</p:dataTable>
Bean:
public void onRowSelect(SelectEvent event) {
Car carro = (Car) event.getObject() ;
}
Eu não sei qual é a versao do seu jar do Primefaces, caso não consiga troque a primeira linha por:
<p:dataTable ... var="car" rowKey="#{car}" selectionMode="single">
<p:ajax event="rowSelect" listener="#{tableBean.onRowSelect}" >
Abraços,
Gustavo
Oi Gustavo, muito obrigada por responder. =)
Na verdade, o que eu quero é pegar o objeto da linha clicada e abrir outra página. Nessa outra página eu quero usar esse objeto como parâmetro de uma função no dataTable.
Tipo assim,
<p:dataTable id="notifs" var="cli" value="#{clinDataBean.listDataNotifSearch(code)}" >
</p:dataTable>
onde o “code” é meu objeto.
Desse jeito acima não sei se dá para fazer. Gostaria de saber se existe um jeito de pegar um objeto de uma página e utilizá-lo em outra.
Eu uso o Primefaces 3.0 e JSF 2.1.
Abração.
Claro que isso é possível uai.
<p:commandLink id="ajax" update="panel,display" actionListener="#{pprBean.savePerson}" style="margin-right:20px;">
<h:outputText value="Ajax Submit" />
</p:commandLink>
Esse savePerson será o metodo que você vai ter o objeto pronto e poderá direcionar o usuario para a tela desejada com o objeto selecionado
Você já deve ter resolvido seu problema , mas passei por algo parecido e consegui está solução
Essa é uma coluna da minha datatable
<t:column sortable="false" id="nmAnexo" columnId="nmAnexo">
<f:facet name="header">
<h:outputText value="Anexo" />
</f:facet>
<h:commandLink value="#{row.nmNome}" action="#{arquivoBean.baixarAnexo}">
<f:setPropertyActionListener value="#{row}" target="#{arquivoBean.rowArquivoAta}"/>
</h:commandLink>
</t:column>
row é minha lista de objetos que está sendo mostrada na tabela.
Ex: datatable=> value="#{arquivoBean.listaObjetos}" var="row"
Ao clicar no nome do anexo ele chama o método baixarAnexo no meu Bean e nesse metodo eu preciso do objeto clicado.
Para pega-lo usei f:setPropertyActionListener
onde value recebe meu row que é minha listaObjetos e target vai setar o Objeto clicado no Objeto que criei em meu Bean.
############Bean
public class ArquivoBean implements Serializable{
private ArquivoAta rowArquivoAta;
private ArquivoAta arquivoAta;
private List<ArquivoAta> listaObjetos;
public void baixarAnexo() {
//Aqui pego o objeto clicado
this.setArquivoAta(this.getRowArquivoAta());
//arquivoAta contém o objeto clicado
arquivoAta.getIdAta();
}
public ArquivoAta getRowArquivoAta() {
if(arquivoAta==null){
arquivoAta = new ArquivoAta();
}
return rowArquivoAta;
}
public void setRowArquivoAta(ArquivoAta rowArquivoAta) {
this.rowArquivoAta = rowArquivoAta;
}
public ArquivoAta getArquivoAta() {
return arquivoAta;
}
public void setArquivoAta(ArquivoAta arquivoAta) {
if(arquivoAta==null){
arquivoAta = new ArquivoAta();
}
this.arquivoAta = arquivoAta;
}
}
Não sei sé está é a melhor forma mas, resolveu pra min
Abraços.