Hebert_Coelho 9 de abr. de 2012
crie um get/set no seu MB
e chame pelo <f:setPropertyActionListener target="#{seuMB.contato}" value="#{contato}"/>
mauricioadl 9 de abr. de 2012
fiz isso, mas o objeto nunca chega. meu codigo:
& lt ; h : inputText value = "#{contato.telefone}" & gt ;
& lt ; p : ajax event = "change" update = "@form"
listener = "#{contatoController.update}" & gt ;
& lt ; f : setPropertyActionListener target = "#{contatoController.contato}"
value = "#{contato}" /& gt ;
& lt ; / p : ajax & gt ;
& lt ; / h : inputText & gt ;
MB
public void setContato ( Contato contato ) {
System . out . println ( contato );
this . contato = contato ;
}
public void update ( AjaxBehaviorEvent abe ) {
System . out . println ( "update" );
}
rmaragno 10 de abr. de 2012
tenta +- assim:
<p:dataTable var= "contatos" id= "dtContatos" value= "#{contatoController.contatos}" style= "font-size:0.8em;" >
<p:column>
<p:commandButton action= "#{contatoController.teste}" >
<f:setPropertyActionListener target= "#{contatoController.contato}"
value= "#{contatos}" />
</p:commandButton>
</p:column>
<p:column>
<h:outputText value= "#{contato.id}" />
</p:column>
</p:dataTable>
supondo que contatos é uma lista de objetos
e contato é um objeto
mauricioadl 10 de abr. de 2012
rmaragno obrigado pela dica! mas preciso que o evento seja disparado no change do inputText. A ideia é fazer um dataTable 100% editável
pela quantidade de testes que fiz, acho que não será possivel, se alguem tiver alguma dica, estou disposto a tentar hehehe
[]'s
rmaragno 10 de abr. de 2012
ai você tem que usar o row editor
<p:column>
<f:facet name="header">
<h:outputText value="Opções" styleClass="itemTitulo9" />
</f:facet>
<p:rowEditor />
</p:column>
lembrando que você vai ter que usar um output e um input em todas suas colunas
ex:
<p:column>
<f:facet name= "header" >
<h:outputText value= "TESTE" />
</f:facet>
<p:cellEditor>
<f:facet name= "output" >
<h:outputText value= "#{contatos.teste}" />
</f:facet>
<f:facet name= "input" >
<p:inputText value= "#{contatos.teste}" />
</f:facet>
</p:cellEditor>
</p:column>
e se quiser gravar isso tudo no banco, coloca na declaração do datatable o evento:
rowEditListener = "#{seuBean.salvarMudancasNoRowEdit}"
e criar o respectivo método para gravar
mauricioadl 10 de abr. de 2012
cara, esse rowEditor eh uma gambiarra tremenda, nao posso fazer desse jeito. preciso fazer algo que fica igual aos grid’s do sencha, zk, kendo, etc.
ta complicado a coisa aqui. hehehe
vlw as dicas
mais algumas???
rmaragno 10 de abr. de 2012
tem que ser no próprio datatable?
não pode chamar um dialog e editar?
mauricioadl 10 de abr. de 2012
rmaragno:
tem que ser no próprio datatable?
não pode chamar um dialog e editar?
nao precisa ser exatamente o dataTable, mas ele eh o container certo para essas coisas. a ideia eh fazer o Grid totalmente editavel, onde o usuario alterou um campo ele vai e grava no banco de dados.
eu ate consigo fazer isso com a tag f:ajax em todo o dataTable, mas ela nao passa o objeto que corresponde a linha e sim o valor do inputText, isso eh ruim, prq no managed bean eu nao consigo identificar de quem eh a coluna. entendeu meu dilema?
[]'s
mauricioadl 10 de abr. de 2012
Consegui, utilizando a tag f:param. o problema que o valor que ela passa é o OLD e nao o NEW. vou brigar com isso agora.
segue o codigo:
& lt ; p : dataTable value = "#{contatoController.contatos}" var = "contato" & gt ;
& lt ; f : ajax listener = "#{contatoController.update}" immediate = "true" & gt ;
& lt ; f : param name = "contato" value = "#{contato}" /& gt ;
& lt ; p : column headerText = "Nome" & gt ;
& lt ; h : inputText value = "#{contato.nome}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "E-mail" & gt ;
& lt ; a : inputText value = "#{contato.email}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "Telefone" & gt ;
& lt ; a : inputText value = "#{contato.telefone}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "Assunto" & gt ;
& lt ; a : inputText value = "#{contato.assunto}" /& gt ;
& lt ; / p : column & gt ;
& lt ; / f : ajax & gt ;
& lt ; / p : dataTable & gt ;
rmaragno 27 de abr. de 2012
mauricioadl 27 de abr. de 2012
rmaragno, to conseguindo.
estou tendo dificuldades para lançar evento quando o usuario troca de linha na table, fiz uma função em javascript/jquery que coloca enventos em todos os componentes da tabela, porem quando há duas tabelas na mesma tela da conflito entre as variaves javascript.
no mais eu resolvi criando um componente com composite components, ta ficando profissional o negocio hehehe
[]'s
cristianoassis 4 de mai. de 2012
Poxa, tem como postar o código ? Estou com esse problemas pois estou migrando da versão 2.2 do primefaces para 3.2.
Grato.
mauricioadl 4 de mai. de 2012
& lt ; ui : component xmlns = "http://www.w3.org/1999/xhtml"
xmlns : f = "http://java.sun.com/jsf/core"
xmlns : h = "http://java.sun.com/jsf/html"
xmlns : ui = "http://java.sun.com/jsf/facelets"
xmlns : composite = "http://java.sun.com/jsf/composite"
xmlns : c = "http://java.sun.com/jsp/jstl/core"
xmlns : p = "http://primefaces.org/ui" & gt ;
& lt ; composite : interface componentType = "dataTable" & gt ;
& lt ; composite : attribute name = "value" /& gt ;
& lt ; / composite : interface & gt ;
& lt ; composite : implementation & gt ;
& lt ; p : dataTable value = "#{cc.rows}" id = "my_data_table" & gt ;
& lt ; c : set target = "#{component}" property = "var" value = "#{cc.attrs.var}" /& gt ;
& lt ; c : set target = "#{component}" property = "rowIndexVar"
value = "#{cc.attrs.rowIndexVar}" /& gt ;
& lt ; composite : insertFacet name = "header" /& gt ;
& lt ; p : column & gt ;
& lt ; h : outputText value = "#{cc.rows.rowIndex + 1}" /& gt ;
& lt ; p : remoteCommand action = "#{cc.save}"
name = "rc_#{cc.rows.rowIndex}_#{cc.attrs.id}" update = "@form" /& gt ;
& lt ; / p : column & gt ;
& lt ; composite : insertChildren /& gt ;
& lt ; p : column style = "width: 100px !important;" & gt ;
& lt ; p : commandButton title = "Salvar" icon = "ui-icon-disk"
action = "#{cc.save}" process = "@this" update = "@form" /& gt ;
& lt ; p : commandButton title = "Excluir" icon = "ui-icon-trash"
action = "#{cc.delete}" process = "@this" update = "@form" /& gt ;
& lt ; / p : column & gt ;
& lt ; composite : insertFacet name = "footer" /& gt ;
& lt ; / p : dataTable & gt ;
& lt ; / composite : implementation & gt ;
& lt ; / ui : component & gt ;
mauricioadl 4 de mai. de 2012
@FacesComponent ( value = "dataTable" )
public class DataTable extends UIInput implements NamingContainer , Serializable {
private ListDataModel rows ;
private List wrapper ;
public ListDataModel getRows () {
if ( rows == null ) {
rows = new ListDataModel (( List ) getValue ());
wrapper = ( List ) rows . getWrappedData ();
}
return rows ;
}
@Override
public String getFamily () {
return "javax.faces.NamingContainer" ;
}
public void save () {
System . out . println ( "Save: " + rows . getRowIndex () + " - "
+ rows . getRowData ());
if ( rows . getRowIndex () == rows . getRowCount () - 1 ){
Class c = rows . getRowData (). getClass ();
try {
wrapper . add ( c . newInstance ());
} catch ( Exception e ) {
e . printStackTrace ();
}
}
}
public void delete () {
System . out . println ( "Delete: " + rows . getRowIndex () + " - "
+ rows . getRowData ());
}
}
mauricioadl 4 de mai. de 2012
usa normal, so muda a tag
& lt ; ! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" & gt ;
& lt ; 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.org/ui"
xmlns : a = "http://java.sun.com/jsf/composite/taglib" & gt ;
& lt ; h : head & gt ;
& lt ; h : outputStylesheet library = "css" name = "composite.css" /& gt ;
& lt ; h : outputScript library = "js" name = "helper.js" /& gt ;
& lt ; / h : head & gt ;
& lt ; h : body & gt ;
& lt ; h : form style = "font-size: 12px" & gt ;
& lt ; a : dataTable var = "row" value = "#{contatoController.contatos}" & gt ;
& lt ; p : column headerText = "Nome" & gt ;
& lt ; p : inputText id = "nome" value = "#{row.nome}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "Telefone" & gt ;
& lt ; p : inputText value = "#{row.telefone}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "Assunto" & gt ;
& lt ; p : inputText value = "#{row.assunto}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "Ativo" & gt ;
& lt ; p : selectBooleanCheckbox value = "#{row.ativo}" /& gt ;
& lt ; / p : column & gt ;
& lt ; p : column headerText = "E-mail" & gt ;
& lt ; p : inputText value = "#{row.email}" /& gt ;
& lt ; / p : column & gt ;
& lt ; / a : dataTable & gt ;
& lt ; / h : form & gt ;
& lt ; / h : body & gt ;
& lt ; / html & gt ;
pra enviar a linha usando javascript, basta vc chamar o metodo assim:
rc_NUMERO_DA_LINHA_ID_DATA_TABELA, exemplo:
// envia a linha 0 da table com id mytable
rc_0_mytable();
cristianoassis 4 de mai. de 2012
Muito obrigado Mauricio! Vou testar na minha aplicação.