Pessoal, alguém sabe como usar o include num arquivo .zul?
Preciso dos dados do formulário pai, carregado no formulário filho.
Ou seja, tenho um formulário principal, que estou chamando de pai, onde há um listbox, carregado com os dados do banco. Ao selecionar um registro do listbox, e clicar no botão atualiza, é chamado um novo formulário “filho” (popup), que deve ter o cadastro do usuário selecionado.
O problema é que não estou conseguindo transferir o registro selecionado, para ser editado neste formulário.
Como você cria o popup? Executions.createComponent… ? Mostre seu código.
O código está abaixo.
O listbox é carregado com um método chamado listaAllUsers.
<listbox id="box" multiple="false" rows="1" height="200px" onSelect="[b]onMove()[/b]" >
<listhead>
<listheader label="Nome" width="200px" />
<listheader label="Tipo" width="20px" />
<listheader label="Setor" width="40px" />
<listheader label="E-mail" width="120px" />
<listheader label="Apelido" width="30px" />
</listhead>
<listitem forEach="${listaAllUsers}" value="${each}">
<listcell label="${each.nome}" />
<listcell label="${each.tipoUsuario.descr}"/>
<listcell label="${each.setor.descr}"/>
<listcell label="${each.email}"/>
<listcell label="${each.apelido}"/>
</listitem>
<![CDATA[
//@DECLARATION
void [b]onMove()[/b]{
nome.value = ((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).getNome();
apelido.value = ((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).getApelido();
email.value = ((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).getEmail();
if (((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).isAtivo()){
rdativo.selectedIndex = 0;
}else{
rdativo.selectedIndex = 1;
}
if (((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).isRemoto()){
rdremoto.selectedIndex = 0;
}else{
rdremoto.selectedIndex = 1;
}
cmbtpusuario.value = ((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).getTipoUsuario().getDescr();
cmbsetorusuario.value = ((br.com.centercell.intelbras.pco.model.Usuario)box.getSelectedItem().value).getSetor().getDescr();
}
]]>
O método acima, está carregando como readonly os dados do registro selecionado no listbox, nos componentes mostrados abaixo:
Nome: <textbox id="nome" cols="45" readonly="true"/>
Apelido: <textbox id="apelido" cols="15" readonly="true" />
E-mail: <textbox id="email" cols="30" readonly="true" />
<radiogroup id="rdativo">
<radio id="rdativosim" label="Sim" disabled="true" />
<radio id="rdativonao" label="Não" disabled="true" />
</radiogroup>
<radiogroup id="rdremoto" >
<radio id="rdremotosim" label="Sim" disabled="true"/>
<radio id="rdremotonao" label="Não" disabled="true"/>
</radiogroup>
<combobox id="cmbtpusuario" disabled="true">
<comboitem id="tipos" forEach="${listaTpUsuarios}" value="${each}" label="${each.idTipoUsuario}" description="${each.descr}" />
</combobox>
<combobox id="cmbsetorusuario" disabled="true">
<comboitem forEach="${listaSetores}" value="${each}" label="${each.idSetor}" description="${each.descr}" />
</combobox>
Abaixo eu chamo o formulário para atualizar os dados do registro selecionado.
<button id="btnatualizar" label="Atualizar usuário selecionado">
<attribute name="onClick">
<![CDATA[
Window atualizaform = (Window) Executions.createComponents(
"atualiza.zul", null, null);
atualizaform.doModal();
]]>
</attribute>
</button>
O que eu quero é no momento que eu chamo o formulário atualiza.zul, carrega-lo com os dados do registro selecionado no listbox.
Você não está usando classes Java para as páginas?
Minha sugestão seria que seu popup tivesse uma classe Java para ele, no zul dele você diria use=“MinhaClasseWindow”, e no Executions.createComponents você daria um cast para o MinhaClasseWindow. MinhaClasseWindow seria uma classe que recebia os dados necessários para exibir, através de métodos set.
Alguma coisa assim…
Estou fazendo MVC sim. Apenas este método move() está no zul.
O fato é que preciso alimentar os campos do formulário filho (atualiza.zul) quando ele abrir, com os dados do item selecionado (clicado) no listbox que está no formulário pai.
Obrigado pelo sua dica. Mas acho que ainda não é a solução. Pensei no include para poder usar os id’s do formulário pai no formulário filho, mas não sei como usar o include no zkoss. Procurei bastante ne net, mas ainda não achei solução.
Pra mim a idéia é essa, o popup tem que ser capaz de receber dados para exibir, ou algum parâmetro para exibir certos dados e outros não. Digo isso por já ter feito assim.
Tag include do zk…
http://www.potix.com/doc/devguide/ch07s17s04.html
Aproveita e baixa a documentação do zk que vai te ajudar muito…
flw!
amoreiraedu
Passagem de parametros para um popup:
[code]Map params = new HashMap();
params.put(“identificador”, objeto);
Window w = (Window)Executions.createComponents("/pages/pagina.zul",wndPrincipal, params);
w.doModal();
SuaClasse o = (SuaClasse)w.getAttribute(“identificador”);
[/code]
Na página do popup “pagina.zul”
[code]
n.setId(Long.valueOf(idCodigo.getValue()));
n.setDescricao(idDescricao.getValue());
wndEdicao.setAttribute("identificador",n);
wndEdicao.detach();
}
]]>
[/code]
Obs: wndPrincipal e wndEdicao são os identificadores ( “id=wndEdicao” ) das janelas.
Lembrando que: utilizar o atributo USE não caracteriza o desacoplamento do código da view no ZK, deverá ser utilizado o APPLY para obter este tipo de coisa; a última versão tem algumas pequenas facilidades para implementações neste padrão.
flws
Valeu cara. Deixa ver se eu entendi fantomas.
params.put("identificador", objeto);
<- Aqui é o identificador da window, certo?
SuaClasse o = (SuaClasse)w.getAttribute("identificador");
<- Aqui seria a classe e o identificador de um atributo da classe, certo? Deve ser feito isso para cada atributo da classe, que for transferido para a página popup?
Quanto as campos, eu preciso passar o valor que estiver setado, ou seja, selecionado no listbox.
Quando seleciono um registro no listbox ele coloca os valores selecionados em textbox, radiobutton e combobox como readonly, e é justamente este valor que eu envio para a janela popup, para que seja editado pelo usuário.
É um CRUD de update que estou querendo fazer, onde o usuário seleciona o registro que quer alterar clica no botão alterar e este botão chama o popup que carrega com os dados selecionados no listbox.
Pelo que vi da forma acima nós estamos enviando todos os valores possíveis do atributo e não aquele que esta setado no listbox, estou certo?
Então…infelizmente ai não tem nenhuma jogada especial.
Os parametros são passados (ao menos foi a maneira que descobri até agora) através de MAP, ele necessita de uma chave (eu coloquei a string “identificador”, poderia ser qualquer outra coisa) e um object associado a essa chave.
EX:
Map params = new HashMap();
String name = "Zuleika"
params.put("cod_30", name);
System.out.println(params.get("cod_30"));
No seu caso, se entendi bem, vc terá que obter o valor selecionado pelo usuário e coloca-lo no Map passando para o popup em seguida.
Espero ter ajudado.
flws