Ver Mensaje Individual
  #12 (permalink)  
Antiguo 06/03/2009, 12:58
Avatar de jeybi
jeybi
 
Fecha de Ingreso: julio-2008
Ubicación: Mexico
Mensajes: 130
Antigüedad: 15 años, 10 meses
Puntos: 10
Respuesta: arreglo de checkbox y su validacion

Ok mira, la solucion fue sencilla, solamente hize la funcion recursiva
Código javascript:
Ver original
  1. function tildar(modelo) {
  2. if(!modelo.className)  //Esto se ejecuta cuando llegamos al tope, el ultimo padre
  3.     return;
  4.    
  5. if(modelo.checked == true) {   //Se ha checkeado nuestro checkbox modelo
  6.     modelo.form[modelo.className].checked = true;  //Chekeamos la marca correspondiente al modelo (la cual esta especificada en el class de nuestro modelo
  7.     modelo.form[modelo.className].disabled = 'disabled';
  8.  
  9. }
  10. 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)
  11. var checks = 0;
  12. var inputs = modelo.form.getElementsByTagName('input'); //Obtenemos todos los inputs de la forma actual
  13. for(var i = 0;i < inputs.length; i++){   //Checamos cada uno de ellos
  14.     if(inputs[i].type == 'checkbox'){//Si el input en curso es un checkbox
  15.         //Si tiene la misma class que nuestro chexbox clikeado (pertenecen a la misma marca), y esta marcado..
  16.         if(inputs[i].className == modelo.className  && inputs[i].checked == true){
  17.             checks++;                         //Aumentamos en uno la variables chexks            
  18.         }
  19.     }
  20. }
  21.  
  22. if(checks == 0) {//Si ningun otro modelo de la misma marca esta cheked, entonces podemos desmarcar la marca
  23.     modelo.form[modelo.className].checked = false;  
  24.     modelo.form[modelo.className].removeAttribute('disabled');
  25. }
  26.    
  27. else //Si no, la marcamos, esto por si el usuario desmarco la 'marca' intencionalmente
  28.     modelo.form[modelo.className].checked = true;
  29. }
  30.  
  31. if(modelo.form[modelo.className].form[modelo.className])
  32.     tildar(modelo.form[modelo.className].form[modelo.className]);
  33. }

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 original
  1. if(checks == 0) {//Si ningun otro modelo de la misma marca esta cheked, entonces podemos desmarcar la marca
  2.     modelo.form[modelo.className].checked = false;  
  3.     modelo.form[modelo.className].removeAttribute('disabled');
  4. }
  5.    
  6. else //Si no, la marcamos, esto por si el usuario desmarco la 'marca' intencionalmente
  7.     modelo.form[modelo.className].checked = true;
  8. }
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
  1. <form method="post" action="abc.cgi">
  2. <input type='checkbox' value='$id_marca' name='nombre_marca[0]';> Marca
  3. <br/>
  4.  
  5. <input type='checkbox' value='$id_modelo' name='nombre_modelo[0]' onClick="tildar(this)" class="nombre_marca[0]">Modelo1
  6. <input type='checkbox' value='$id_modelo' name='nombre_modelo[1]' onClick="tildar(this)" class="nombre_marca[0]">Modelo2
  7. <input type='checkbox' value='$id_modelo' name='nombre_modelo[2]' onClick="tildar(this)" class="nombre_marca[0]">Modelo3
  8. <br />
  9.  
  10. <input type='checkbox' value='$id_version' name='numero_version[0]' onClick="tildar(this)" class="nombre_modelo[0]">Modelo1 Version1
  11. <input type='checkbox' value='$id_version' name='numero_version[1]' onClick="tildar(this)" class="nombre_modelo[0]">Modelo1 Version2
  12. <br />
  13. <input type='checkbox' value='$id_version' name='numero_version[2]' onClick="tildar(this)" class="nombre_modelo[1]">Modelo2 Version1
  14. <input type='checkbox' value='$id_version' name='numero_version[3]' onClick="tildar(this)" class="nombre_modelo[1]">Modelo2 Version2
  15. <br />
  16. <input type='checkbox' value='$id_version' name='numero_version[4]' onClick="tildar(this)" class="nombre_modelo[2]">Modelo3 Version1
  17. <input type='checkbox' value='$id_version' name='numero_version[5]' onClick="tildar(this)" class="nombre_modelo[2]">Modelo3 Version2
  18.  
  19.  <br />
  20.   <br />
  21.  
  22. <input type='checkbox' value='$id_marca' name='nombre_marca[1]' ;>Marca2
  23. <br />
  24.  
  25. <input type='checkbox' value='$id_modelo' name='nombre_modelo[3]' onClick="tildar(this)" class="nombre_marca[1]">Modelo1
  26. <input type='checkbox' value='$id_modelo' name='nombre_modelo[4]' onClick="tildar(this)" class="nombre_marca[1]">Modelo2
  27. <input type='checkbox' value='$id_modelo' name='nombre_modelo[5]' onClick="tildar(this)" class="nombre_marca[1]">Modelo3
  28. </form>

Última edición por jeybi; 06/03/2009 a las 14:02