JavaScript - validar grupo de checkbox

   
Vista:

validar grupo de checkbox

Publicado por Virginia (11 intervenciones) el 12/11/2007 20:32:30
Buenas tardes, he estado trabajando en la validación de un formulario que tiene mas de 50 campos, entre estos 3 grupos de opciones con checkbox de los cuáles en 2 grupos es obligatorio que seleccione al menos 3 opciones de cada grupo; además estos grupos obligatorios estan alineados uno al lado del otro y se arman dinámicamente, extrayendo los datos de una base de datos,
me explico:

<div style="width:628;height:180;overflow:auto;border:0px;">
<table width="600" style="position:relative;left:5px">
<?php
$i=1;
foreach ($array_conocimiento as $datos){
if(is_int($i/2)){
$color="#981E12";
$colorl="#ffffff";
}else{
$color="#ccccce";
$colorl="#000000";
}
?>
<tr id="areas">
<td align="center" bgcolor="<?php echo $color; ?>" width="50"><input type="checkbox" name="tr004_areaconoce_id" value="<?=$datos->id;?>" id="tr004_areaconoce_id<?=$datos->id;?>" /></td>
<td bgcolor="<?php echo $color; ?>" width="100"><font color="<?=$colorl?>"><div class="estiloLetra1"><?php echo htmlspecialchars($datos->descripcion);?></div></font></td>
<td align="center" bgcolor="<?php echo $color; ?>" width="50"><input type="checkbox" name="tr004_areaconocera_id" value="<?=$datos->id;?>" id="tr004_areaconocera_id<?=$datos->id;?>"/></td>
<td bgcolor="<?php echo $color; ?>" width="100"><font color="<?=$colorl?>"><div class="estiloLetra1"><?php echo htmlspecialchars($datos->descripcion);?></div></font></td>
</tr>
<?php
$i++;
}
?>
</table>
</div>

Como se ve en el código, en una misma fila, se encuentra dos elementos, un elemento de cada grupo.

La función de validación es como sigue:

//esta función valida que los campos obligatorios no esten vacios y arma varios vectores
//contentivos de los campos y valores que deben ser insertados en las diferentes tablas
//la idea es armar por cada tabla, un vector aparte que lleve los datos a realizar la inserción
//en dichas tablas

function valida(formulario){
var f = 0;
var m = 0;
var x = 0;
var u = 0;
var g = 0;
var cont = 0;
var cadena = new Array();
var names = new Array();
var values = new Array();
var acumula = new Array();
var idvalor = new Array();
//var totaliza = 0; //para llevar el total de los elementos checkbox pertenecientes a un grupo
var nocheck = 0;

//se busca la cantidad de columnas que tiene la tabla 'areas'
//que en este caso, contiene los dos grupos de opciones de las
//que son obligatorias seleccionar 3 de cada grupo
colNumber = document.getElementById('areas').cells.length;
//para saber cuántos grupos hay, es estrictamente necesario que cada grupo conste solo de
//un checkbox y un text
groupNumber = colNumber/2;

for (var i=0;i<formulario.elements.length;i++){
opcion=formulario.elements[i].type;

switch (opcion){
case 'text':
case 'textarea':
case 'hidden':
if((formulario.elements[i].id != "") && (formulario.elements[i].value == "")){
a = false;
}
else{
if(formulario.elements[i].value != ""){
valor = formulario.elements[i].value;
nombre = formulario.elements[i].name;
cadena[f] = nombre+"="+valor+"-*-";
f++;
}
}
break;
case 'select-one':
valorEncode=escape(formulario.elements[i].options[formulario.elements[i].selectedIndex].value);
if((formulario.elements[i].id != "") && (valorEncode == "")){
a = false;
}
else{
if(valorEncode != ""){
valor = valorEncode;
nombre = formulario.elements[i].name;
cadena[f] = nombre+"="+valor+"-*-";
f++;
}
}
break;
case 'checkbox':
case 'radio':
var existe = true;
check = formulario.elements[i].checked;
nombre = formulario.elements[i].name;
if(opcion == 'checkbox'){
if(formulario.elements[i].id != ""){
pos = i;
var max = parseInt(document.getElementsByName(formulario.elements[i].name).length);
for(g = 0; g < groupNumber; g++){
alert("entra "+g)
cont=0;
for (var idx = 1; parseInt(idx) <= max; idx++) {
if (document.getElementById(nombre+idx).checked == true) {
cont += 1;
idvalor[cont] = document.getElementById(nombre+idx).id;
}
}
acumula[g]=cont;

i = i + max;
names[g] = formulario.elements[pos].name;
pos = pos + 1;

cadena[f] = names[g]+"="+idvalor+"-*-";
f++;

alert("acumulado "+acumula)
alert("acumulado en "+g+" = "+acumula[g])
}
}//fin if obligatorios
}//fin if checkbox
break;
}

}
if(!a){
alert("Introduzca todos los campos obligatorios")
return;
}
else
{
Ajaxinsertar(cadena);
}
}

El conflicto se presenta en esta parte:

if(opcion == 'checkbox'){
if(formulario.elements[i].id != ""){
pos = i;
var max = parseInt(document.getElementsByName(formulario.elements[i].name).length);
for(g = 0; g < groupNumber; g++){
alert("entra "+g)
cont=0;
for (var idx = 1; parseInt(idx) <= max; idx++) {
if (document.getElementById(nombre+idx).checked == true) {
cont += 1;
idvalor[cont] = document.getElementById(nombre+idx).id;
}
}
acumula[g]=cont;

i = i + max;
names[g] = formulario.elements[pos].name;
pos = pos + 1;

cadena[f] = names[g]+"="+idvalor+"-*-";
f++;

alert("acumulado "+acumula)
alert("acumulado en "+g+" = "+acumula[g])
}
}//fin if obligatorios
}//fin if checkbox

pues no he podido lograr que el contador cont se limpie cada vez que entra a contar las opciones seleccionadas por cada grupo, siempre se queda con el primer valor y me asigna en cada posición del vector acumula el primer valor que posee...

acumula es un vector que debe almacenar cuántas opciones han sido seleccionadas de cada grupo para validar que se hayan seleccionado al menos 3 de cada uno.

names es un vector que me almacena los nombres de los campos checkbox que identifican a cada grupo para luego asociarlo a su par respectivo (idvalor) que debe guardarse en otro vector que aún no he armado....

Si alguien puede ayudarme a resolver esto se lo agradecería...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder