Capturar item do Combo e enviar pra MB

4 respostas
serjaumfantin

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:
<!--  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.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>

--------------------------------------------------------------------------------------------
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: , o que eu preciso é saber o que coloca no lugar do "1".

Alguém pode ajudar?

Agradeço antecipadamente!

4 Respostas

G

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 …

Rafael_Nunes

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.

serjaumfantin

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

serjaumfantin
Segue o código relevante: MB:
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());
	}
XHTML:
<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>
</html>
Criado 12 de março de 2009
Ultima resposta 13 de mar. de 2009
Respostas 4
Participantes 3