Oi Pessoal!
Continuando com a série sobre a Shuttle, vamos destrinchar um pouco melhor o funcionamento detalhado do componente JSF que a monta.
O componente af:selectManyShuttle precisa saber quais são os itens que devem ser renderizados nas listas leading e trailing. Isto é feito gerando uma lista de objetos da classe javax.faces.view.SelectItem, ou através de uma tag [f:selectItems] ou através de um loop [f:forEach] que imprima uma sequência de [f:selectItem].
Todo objeto SelectItem tem um valor ("value") e uma descrição. Para informar a shuttle quais valores devem estar do lado trailing (selecionados), montamos uma lista contendo os códigos dos itens selecionados, que devem ser equivalentes ao atributo "value" dos selectItems existentes na Shuttle, e informamos no atributo "value" da própria Shuttle a referÊncia para esta lista no managed bean. Exemplo de shuttle baseada inteiramente no Backing Bean:
[af:selectManyShuttle value="#{ShuttleControl.shuttleValues}"]
[f:selectItems value="#{ShuttleControl.shuttleElements}"]
[/af:selectManyShuttle]
Código do Backing Bean:
public class ShuttleControl {
private int[] shuttleValues; (Lista de códigos, pode ser trocado para List)
private SelectItem[] shuttleElements; (Também pode virar List)
//Getters e Setters omitidos.
}
Exemplo baseado em um ADF Table Binding, usando forEach pra popular os itens (mantendo o backing bean inalterado):
[af:selectManyShuttle value="#{ShuttleControl.shuttleValues}"]
[af:forEach var="li" value="#{bindings.ShuttleElements.rangeSet}"]
[f:selectItem value="#{li.Cod}" description="#{li.Desc}"]
[/af:forEach]
[/af:selectManyShuttle]
PageDefinition desta página:
...
[bindings]
[table iterator="ShuttleVOIter" Id="ShuttleElements"]
[attributes]
[Item name="Cod"/]
[Item name="Desc"/]
[/attributes]
[/table]
[/bindings]
Com esta configuração, podemos colocar um botão na página que a submeta, apontando para um método do Backing Bean da Shuttle. Neste método, a lista com os códigos movidos pelo usuário da leading pra trailing estará disponível no Bean no atributo shuttleValues. Podemos passá-lo para um método do Application Module que faça a inserção programática dos registros no View Object.
Exemplo:
[af:commandButton value="Submeter" action="#{ShuttleControl.onSubmitShuttle}"/]
Método no Backing Bean:
public String onSubmitShuttle() {
OperationBinding method = FacesContext.getCurrentInstance().getValue("#{bindings.applyShuttleValues}");
method.getParamsMap().put("nomeDoparametroList", shuttleValues");
method.execute();
return null; //fica na mesma página
}
Método no Application Module:
public void applyShuttleValues(List nomeDoParametroList) {
ViewObjectImpl view = getShuttleVO();
for (Iterator it = nomeDoParametroList.iterator(); it.hasNext();) {
Integer i = (Integer) it.next();
Row r = view.createRow();
r.setAttribute("Cod", i);
view.insertRow(r);
r.setStatus(Row.STATUS_INITIALIZED);
}
}
No próximo Post vamos demonstrar algumas maneiras de incrementar esta shuttle. Até lá!
quinta-feira, 27 de março de 2008
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário