Olá pessoal,
preciso capturar o id de um item do combo e enviar para o meu MB. Tenho quatro combos aninhados. Assim que eu clico no primeiro, os outros 3 são renderizados. Segue o código:
XHTML:
[code]
<h:outputLabel for=“categoria” value=“Categoria " styleClass=“rotulos” />
<h:selectOneMenu id=“categoria” value=”#{categoriaFace.categoria.id}" rendered=“true”>
<f:selectItems value="#{categoriaFace.categorias}" />
<a4j:support event=“onchange” ajaxSingle=“true” action="#{categoriaFace.actionCarregaTodosCombos}" reRender=“categoria,subcategoria,parametro,subparametro”>
<f:setPropertyActionListener value=“1” target="#{categoriaFace.subCategoria.id}" />
</a4j:support>
</h:selectOneMenu>
<h:outputLabel for="parametro" value=" - Parâmetro "styleClass="rotulos" />
<h:selectOneMenu id="parametro" value="#{categoriaFace.parametro.id}" rendered="true">
<f:selectItems value="#{categoriaFace.parametros}" />
</h:selectOneMenu>
<h:outputLabel for="subcategoria" value="Sub categoria " styleClass="rotulos" />
<h:selectOneMenu id="subcategoria" value="#{categoriaFace.subCategoria.id}" rendered="true">
<f:selectItems value="#{categoriaFace.subCategorias}" />
</h:selectOneMenu>
<h:outputLabel for="subparametro" value=" - Sub Parâmetro " styleClass="rotulos" />
<h:selectOneMenu id="subparametro" value="#{categoriaFace.subParametro.id}" rendered="true">
<f:selectItems value="#{categoriaFace.subParametros}" />
</h:selectOneMenu>[/code]
Os combos categoria, subcategoria e parametro estão funcionando certinho. Só o último combo (subparametro) que não, pois ele precisa do id da subcategoria que foi renderizada. Eu setei o id na mão pra testar e funciona: <f:setPropertyActionListener value=“1” target="#categoriaFace .subCategoria.id}" /> , o que eu preciso é saber o que coloca no lugar do “1” .
Alguém pode ajudar?
Agradeço antecipadamente!
guimoz
Março 12, 2009, 1:31pm
#2
hmm
deveria funcionar do jeito q esta … sem ter q setar na mao
um combo depende do outro certo ?
pq vc, ao invez de rederizer todos a partir d um, n vai renderizando um depois do outro( bota +1 q ajaxsupport nos combos ), so pra testa mesmo …
Mais fácil você fazer isso no seu MB.
No método que está setando os valores para o seu subcategoria, manda executar novamente o que faz a busca para os subparâmetros.
Não deu certo. Mesmo colocando pra chamar novamente o método eu vou precisar passar o id da subcategoria pro MB, e ele não está sendo enviado. Depois da alteração que fiz no código continuo recebendo: this.getSubCategoria().getId() >>> null .
Agora… o id da Categoria(primeiro combo) é enviado pro MB quando um dos itens é escolhido. Eu preciso fazer a mesma coisa e receber o id da subCategoria do outro lado. Daí é só sucesso!
Valew
Segue o código relevante:
MB: [code]public class CategoriaFace {
private Categoria categoria = new Categoria();
private Parametro parametro = new Parametro();
private SubCategoria subCategoria = new SubCategoria();
private SubParametro subParametro = new SubParametro();
private List<SelectItem> subCategorias = new ArrayList<SelectItem>();
private List<Parametro> parametros = new ArrayList<Parametro>();
private List<SubParametro> subParametros = new ArrayList<SubParametro>();
/**
* metodo que carrega o combo "categoria" com todas as categorias do banco.
* @return
*/
public List<SelectItem> getCategorias(){
Session session = HibernateUtil.currentSession();
CategoriaDAO dao = new CategoriaDAO(session);
List<Categoria> lc = dao.loadAll();
List<SelectItem> items = new ArrayList<SelectItem>(lc.size());
for(Categoria cat : lc){
items.add(new SelectItem(cat.getId(), cat.getNome()));
}
System.out.println("getCategorias() invocado!");
System.out.println("this.categoria.getId() >>> " + this.categoria.getId());
return items;
}
/**
* metodo que carrega o combo(subCategoria) com todas subCategorias relacionadas a categoria o qual foi escolhida no combo "categoria"
* @return
*/
public String actionCarregaComboSubcategoria(){
this.subCategorias = getSubcategoriasByCategoria(this.getCategoria().getId());
System.out.println("actionCarregaTodosCombos() invocado!");
System.out.println("this.getSubCategoria().getId() >>> " + this.getSubCategoria().getId());
System.out.println("this.getCategoria().getId() >>> " + this.getCategoria().getId());
return "carregaCombosSubCategoriaSucesso";
}
/**
* metodo que preenche a tabela (tableParams) com todos os parametros relacionados a categoria escolhida
* @return
*/
public List<Parametro> getParametrosByCategoria(){
Session session = HibernateUtil.currentSession();
CategoriaDAO dao = new CategoriaDAO(session);
System.out.println("getParametrosByCategoria() invocado!");
return dao.pesquisaParametrosByCategoriaId(this.getCategoria().getId());
}
/**
* metodo que preenche o combo (subCategoria) com todas as subCategorias relacionadas a categoria escolhida no primeiro combo.
* Este metodo eh invocado pelo metodo "actionCarregaComboSubcategoria"
* @param idCategoria
* @return
*/
public List<SelectItem> getSubcategoriasByCategoria(long idCategoria){
Session session = HibernateUtil.currentSession();
CategoriaDAO dao = new CategoriaDAO(session);
List<SubCategoria> subcategorias = dao.pesquisaSubcategoriasByCategoriaId(idCategoria);
List<SelectItem> items = new ArrayList<SelectItem>(subcategorias.size());
System.out.println("getSubcategoriasByCategoria() invocado!");
for(SubCategoria subcat : subcategorias){
items.add(new SelectItem(subcat.getId(), subcat.getNome()));
}
System.out.println("items >>> " + items);
return items;
}
/**
* metodo que "DEVERIA" preencher a tabela (tableSubParams) com todos os subParametros relacionados a subCategoria escolhida
* Eh nesse metodo que esta dando null: * this.getSubCategoria().getId() >>> null
* @return
*/
public List<SubParametro> getSubParametrosBySubCategoria(){
Session session = HibernateUtil.currentSession();
CategoriaDAO dao = new CategoriaDAO(session);
System.out.println("getSubParametrosBySubCategoria() invocado!");
System.out.println(" * this.getSubCategoria().getId() >>> " + this.getSubCategoria().getId());
return dao.pesquisaSubParametrosBySubCategoriaId(this.getSubCategoria().getId());
}[/code]XHTML:[code]<ui:composition>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Pesquisa de Categorias</title>
<link rel="StyleSheet" type="text/css" href="/sistema/style/estilos.css" media="screen" />
<script type="text/javascript" src="/sistema/resources/jquery.maskedinput-1.2.1.js"></script>
</head>
<body>
<h:messages style="color:#f00;" />
<f:view>
<h:form acceptcharset="UTF-8">
<fieldset>
<legend>Pesquisa Categoria</legend>
<h:panelGrid columns="1">
<!-- categorias -->
<h:outputLabel for="categoria" value="Categoria " styleClass="rotulos" />
<h:selectOneMenu id="categoria" value="#{categoriaFace.categoria.id}" rendered="true">
<f:selectItems value="#{categoriaFace.categorias}" />
<a4j:support event="onchange" ajaxSingle="true" action="#{categoriaFace.actionCarregaComboSubcategoria}" reRender="categoria,subcategoria,tableParams,tableSubParams"/>
</h:selectOneMenu>
<!-- parametros -->
<h:outputText value="Parâmetros" />
<rich:dataTable value="#{categoriaFace.parametrosByCategoria}" var="parametro" rendered="true" rows="5" id="tableParams" width="30%" cellspacing="0" cellpadding="0" border="0">
<h:column>
<h:outputText value="#{parametro.nome}" />
</h:column>
<h:column>
<h:outputText value="#{parametro.escolhido}" />
<h:selectBooleanCheckbox value="true" id="checkBoxParam"/>
</h:column>
</rich:dataTable>
<f:verbatim><br/></f:verbatim>
<h:outputLabel for="subcategoria" value="Sub categoria " styleClass="rotulos" />
<h:selectOneMenu id="subcategoria" value="#{categoriaFace.subCategoria.id}" rendered="true">
<f:selectItems value="#{categoriaFace.subCategorias}" />
</h:selectOneMenu>
<f:verbatim><br /></f:verbatim>
<!-- sub parametros -->
<h:outputText value="Sub Parâmetros" />
<rich:dataTable value="#{categoriaFace.subParametrosBySubCategoria}" var="subParametro" rendered="true" rows="5" id="tableSubParams" width="30%" cellspacing="0" cellpadding="0" border="0">
<h:column>
<h:outputText value="#{subParametro.nome}" />
</h:column>
<h:column>
<h:outputText value="#{subParametro.escolhido}" />
<h:selectBooleanCheckbox value="true" id="checkBoxSubParam"/>
</h:column>
</rich:dataTable>
</h:panelGrid></fieldset>
</h:form>
</f:view>
</body>
</ui:composition>
[/code]