Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/08/2011, 15:43
jose_cab
 
Fecha de Ingreso: noviembre-2008
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 16 años
Puntos: 0
Menú gerarquico con checkbox que se oculta y debe enviar todos los valores.

Muy buenas. Tengo el siguiente código que desplega un menu dque puede abrirse u ocultarse si pulsamos sobre él y muestra unos checkbox.
Este menú será generado por un resultado de una busqueda en un SQL por lo que el nombre de cada div y de cada checkbox puede variar e incluso haber diversas líneas en el nivel más alto.
La idea es que cuando seleccione un checkbox de un nivel alto, los niveles inferiores se deseleccionen, pero cuando pulse un nivel inferior los superiores se deben deseleccionar, pues la idea es que con este resultado se hará una selección posterior para buscar en un SQL y solo los productos que estén incluidos en esa categoría o subcategoría.

La idea es que si tenemos un menú como el esquema siguiente (más o menos):

Código:
0 -- 
  0_1--
    0_1_1--
    0_1_2
  0_2--
    0_2_5
    0_2_7
    0_2_9
      0_2_9_FA
      0_2_9_TF
3 --
  3_2--
    3_2_6--
  3_5--
Cuando pulsemos sobre el checkbox 0 no se tendrá encuenta ninguno que cuelgan de él, pero si el 3 si está pulsado pues es otro como él
Si el checkbox 0 está pulsado y pulsamos sobre el 0_2_9 no se tendrá en cuenta ni el 0, ni el 0_2 pero si estuviera pulsado el 0_1 o el 0_1_1 por ejemplo si se tendría en cuenta, porque lueggo en el SQL haríamos una busqueda de todos los productos que coincidan con esas categorías.
Así mismo si está pulsado por ejemplo el 0_2_9 y luego se pulsa el 0_2 se deseleccionarán los superiores, como el 0_2_9 o cualquiera superior, pues se buscarán todos los productos del 0_2 que ya los incluye.

No se si se puede hacer al no conocer todos los nombres, pero tengo que dejarlo terminado antes de que acabe la semana.

Alguna sugerencia?

Pueden verlo ejecutandose: http://jsfiddle.net/RyA8Y/2/

Gracias a todos de antemano.




Código HTML:
<style type="text/css">

A.l_tit		{text-decoration: none}
a:link.l_tit   {color: #0066cc}
a:visited.l_tit{color: #0066cc}
a:hover.l_tit	{color: #FF9900}

.fam{height: 10px; width: 10px;} 

.fam_00 {display:block;padding:0px;text-align: left; margin:0}
.fam_10 {display:block;padding:0px;text-align: left; margin-left:10}

.cascada_fam{
padding:0;
font-family: Verdana,Arial,Helvética;font-size: 2.7mm;
font-weight: normal;
vertical-align:text-top;
color: #0066cc;
text-transform: uppercase; 
border-top:1px solid #9999FF; border-bottom:1px solid #9999FF; 
width: 100%;
height: auto;
overflow:auto; margin-top:4px
}
</style>
</head>

<script>
function mostrardiv(el_div,la_pos) {
div = document.getElementById(el_div);
div.style.display = '';
pos = document.getElementById(la_pos);
pos.style.display='none';
}
function cerrar(el_div) {
div = document.getElementById(el_div);
div.style.display='none';
}
//Detectar checkeos
function check_box(obj,n3,n0,n1,n2) {

name_box = casfam[obj.name].name;
valor_box = casfam[obj.name].value;
valor_che = casfam[obj.name].checked;
nivel = n3

if (name_box.substring(0,1) == "v") {
	name_sin = name_box.substring(1,name_box.length)
	casfam[name_sin].checked = valor_che 
	letra = name_sin }
else
	{ letra = ''}

casfam[obj.name].checked = valor_che

// DESMARCAMOS checkboxs niveles inferiores	
// Si pulsamos el nivel 3
if (n3 == "3" && valor_che == true){
	name_2 = "2_" + n0 + "_" + n1 + "_" + n2 
	casfam[name_2].checked = false
	name_1 = "1_" + n0 + "_" + n1 + "_" + n1
	casfam[name_1].checked = false
	name_0 = "0_" + n0 + "_" + n0 + "_" + n0	
	casfam[name_0].checked = false
	}
// Si pulsamos el nivel 2
if (n3 == "2" && valor_che == true){
	name_1 = "1_" + n0 + "_" + n1 + "_" + n1
	casfam[name_1].checked = false
	casfam["v" + name_1].checked = false	
	name_0 = "0_" + n0 + "_" + n0 + "_" + n0	
	casfam[name_0].checked = false
	casfam["v" + name_0].checked = false	
	}	
// Si pulsamos el nivel 1
if (n3 == "1" && valor_che == true){
	name_0 = "0_" + n0 + "_" + n0 + "_" + n0	
	casfam[name_0].checked = false
	casfam["v" + name_0].checked = false
	}		
text_box = "name_box: " + name_box + "\n" + "valor_box: " + valor_box + "\n" + "valor_che: " + valor_che + "\n" + "nivel: " + nivel + "\n" + "letra: " + letra
alert(text_box);
}


</script>
<!-- PRUEBA DE CASCADA DE FAMILIAS -->

<div id="familias" class="cascada_fam">
	<form name="casfam" action>
		<div id="v3" class="fam_00">
			<input class="fam" type="checkbox" name="0_3_3_3" onclick="check_box(this,'0','3','3','3')" value="0|3"><a class="l_tit" href="javascript:mostrardiv('3','v3');"> 
			+ COMPONENTES</a> (5)
		</div>
		<div id="3" style="display:none;" class="fam_00">
			<input class="fam" type="checkbox" name="0_3_3_3" onclick="check_box(this,'0','3','3','3')" value="0|3"><a class="l_tit" href="javascript:mostrardiv('v3','3');"> 
			- COMPONENTES</a> (5)
			<div id="v36" class="fam_10">
				<input class="fam" type="checkbox" name="1_3_36_36" onclick="check_box(this,'1','3','36','36')" value="1|36"><a class="l_tit" href="javascript:mostrardiv('36','v36');"> 
				+ CONTROLADORAS</a> (5)
			</div>
			<div id="36" style="display:none;" class="fam_10">
				<input class="fam" type="checkbox" name="1_3_36_36" onclick="check_box(this,'1','3','36','36')" value="1|36"><a class="l_tit" href="javascript:mostrardiv('v36','36');"> 
				- CONTROLADORAS</a> (5)
				<div id="vEH" class="fam_10">
					<input class="fam" type="checkbox" name="2_3_36_EH" onclick="check_box(this,'2','3','36','EH')" value="2|36"><a class="l_tit" href="javascript:mostrardiv('EH','vEH');"> 
					+ Adaptadores</a> (5)
				</div>
				<div id="EH" style="display:none;" class="fam_10">
					<input class="fam" type="checkbox" name="2_3_36_EH" onclick="check_box(this,'2','3','36','EH')" value="2|36"><a class="l_tit" href="javascript:mostrardiv('vEH','EH');"> 
					- Adaptadores</a> (5)
					<div id="vEH1" class="fam_10">
					<input class="fam" type="checkbox" name="3_3_36_EH" onclick="check_box(this,'3','3','36','EH')" value="3|EH">
						Audio/Video (5)
					</div>
				</div>
			</div>
		</div>
	</form>
</div>