Ok mira, la solucion fue sencilla, solamente hize la funcion recursiva
Código javascript
:
Ver originalfunction tildar(modelo) {
if(!modelo.className) //Esto se ejecuta cuando llegamos al tope, el ultimo padre
return;
if(modelo.checked == true) { //Se ha checkeado nuestro checkbox modelo
modelo.form[modelo.className].checked = true; //Chekeamos la marca correspondiente al modelo (la cual esta especificada en el class de nuestro modelo
modelo.form[modelo.className].disabled = 'disabled';
}
else {//Para desmarcar la marca, debemos checkar si no hay ningun otro modelo activado con esa marca, para eso primero vemos si tenemos activado el checkbox marca, si es asi, continuamos if(modelo.form[modelo.className].checked == true)
var checks = 0;
var inputs = modelo.form.getElementsByTagName('input'); //Obtenemos todos los inputs de la forma actual
for(var i = 0;i < inputs.length; i++){ //Checamos cada uno de ellos
if(inputs[i].type == 'checkbox'){//Si el input en curso es un checkbox
//Si tiene la misma class que nuestro chexbox clikeado (pertenecen a la misma marca), y esta marcado..
if(inputs[i].className == modelo.className && inputs[i].checked == true){
checks++; //Aumentamos en uno la variables chexks
}
}
}
if(checks == 0) {//Si ningun otro modelo de la misma marca esta cheked, entonces podemos desmarcar la marca
modelo.form[modelo.className].checked = false;
modelo.form[modelo.className].removeAttribute('disabled');
}
else //Si no, la marcamos, esto por si el usuario desmarco la 'marca' intencionalmente
modelo.form[modelo.className].checked = true;
}
if(modelo.form[modelo.className].form[modelo.className])
tildar(modelo.form[modelo.className].form[modelo.className]);
}
Cambie algunas cosas:
1. Elimine la condicion ' if(modelo.form[modelo.className].checked == true)' en el primer else, no era necesario y ademas nos impedia volver a marcar el padre (modelo, marca) si fue desmarcado por el usuario (cosa que no pasa porque ahora se deshabilita el chekbox).
2.Añadi un else y una sentencia nueva en el if:
Código javascript
:
Ver originalif(checks == 0) {//Si ningun otro modelo de la misma marca esta cheked, entonces podemos desmarcar la marca
modelo.form[modelo.className].checked = false;
modelo.form[modelo.className].removeAttribute('disabled');
}
else //Si no, la marcamos, esto por si el usuario desmarco la 'marca' intencionalmente
modelo.form[modelo.className].checked = true;
}
Esto deshabilita el boton y lo marca y lo desmarca deacuero con los hijos seleccionados.
3. Añadi un if al final, que comprueba si el class name del padre del elemento actual apunta a algun elemento en la form (referencia class a name), si es asi, la funcion se llama asi misma con el elemento encontrado (el padre del padre de el elemento, el abuelo), y esto continua hasta que se terminen los padres.
4.Añadi modelo.form[modelo.className].disabled = 'disabled'; en el segundo if (en el ejemplo anterior, el primer if), simplemente deshabilitamos el check padre si hemos seleccionado un hijo, asi el usario no podra desacivarlo y mandar informacion incorrecta.
5. Añadi un if:
if(!modelo.className) //Esto se ejecuta cuando llegamos al tope, el ultimo padre
return;
Esto para detener la recursividad y no cause errores, ya que el ultimo ancestro de todos los cheks no tendra una clase que apunte a otro elemento(todo esto es suponiendo que las clases las usas solo para el funcionamiento y que no añadas mas clases o tendras que modificar el chequeo de clases con otra funcion, por ejemplo si añades en el chek de la marca un class='estilo_marca' o algo por estilo deja de funcionar este if y habra errores en el script).
Aun le falta por optimizar varias cosas, pero creo que lo puedes usar tal cual, ademas deberias cambiar todos el nombre del parametro 'modelo' por otro mas ocorde, ya que no siempre checa el modelo y no se ve muy claro que es lo que hace.
EDIT: Aqui el HTML que use de prueba
Código HTML:
Ver original<form method="post" action="abc.cgi"> <input type='checkbox' value='$id_marca' name='nombre_marca[0]';> Marca
<input type='checkbox' value='$id_modelo' name='nombre_modelo[0]' onClick="tildar(this)" class="nombre_marca[0]">Modelo1
<input type='checkbox' value='$id_modelo' name='nombre_modelo[1]' onClick="tildar(this)" class="nombre_marca[0]">Modelo2
<input type='checkbox' value='$id_modelo' name='nombre_modelo[2]' onClick="tildar(this)" class="nombre_marca[0]">Modelo3
<input type='checkbox' value='$id_version' name='numero_version[0]' onClick="tildar(this)" class="nombre_modelo[0]">Modelo1 Version1
<input type='checkbox' value='$id_version' name='numero_version[1]' onClick="tildar(this)" class="nombre_modelo[0]">Modelo1 Version2
<input type='checkbox' value='$id_version' name='numero_version[2]' onClick="tildar(this)" class="nombre_modelo[1]">Modelo2 Version1
<input type='checkbox' value='$id_version' name='numero_version[3]' onClick="tildar(this)" class="nombre_modelo[1]">Modelo2 Version2
<input type='checkbox' value='$id_version' name='numero_version[4]' onClick="tildar(this)" class="nombre_modelo[2]">Modelo3 Version1
<input type='checkbox' value='$id_version' name='numero_version[5]' onClick="tildar(this)" class="nombre_modelo[2]">Modelo3 Version2
<input type='checkbox' value='$id_marca' name='nombre_marca[1]' ;>Marca2
<input type='checkbox' value='$id_modelo' name='nombre_modelo[3]' onClick="tildar(this)" class="nombre_marca[1]">Modelo1
<input type='checkbox' value='$id_modelo' name='nombre_modelo[4]' onClick="tildar(this)" class="nombre_marca[1]">Modelo2
<input type='checkbox' value='$id_modelo' name='nombre_modelo[5]' onClick="tildar(this)" class="nombre_marca[1]">Modelo3