Foros del Web » Programando para Internet » PHP »

Ir guardando checkbox marcados en una lista paginada

Estas en el tema de Ir guardando checkbox marcados en una lista paginada en el foro de PHP en Foros del Web. Hola bien, resulta que tengo una lista paginada con la informacion que saco de la BD y donde la primera columna es un checkbox cuyo ...
  #1 (permalink)  
Antiguo 25/04/2006, 10:04
 
Fecha de Ingreso: enero-2005
Mensajes: 115
Antigüedad: 12 años, 10 meses
Puntos: 1
Exclamación Ir guardando checkbox marcados en una lista paginada

Hola bien, resulta que tengo una lista paginada con la informacion que saco de la BD y donde la primera columna es un checkbox cuyo value es la clave principal de los registros sacados de la BD. Bien pues quiero que esta lista paginada sea un gran formulario, de tal manera que yo pueda ir seleccionando los registros que crea oportunos mediante los checkbox y que cuando cambie de pagina, si asi lo decide el usuario para continuar marcando mas registros, que en la siguente pagina se me queden guardados en algun sitio los registros ya marcados, de forma que si yo vuelvo atras en la paginacion los checkbox ya me salgan marcados y si le doy a enviar datos, me envie todos los checbox marcados en las diferentes paginas que ha recorrido el usuario.

Bueno espero haberme explicado bien, gracias
__________________
SaRvErOk :ojotes:
  #2 (permalink)  
Antiguo 25/04/2006, 10:42
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 11 años, 7 meses
Puntos: 2
La forma de pasar datos entre páginas es a través de GET, POST o mediante el uso de sesiones. Yo te recomendaría que utilizaras sesiones. Si nunca las usaste, podés visitar el manual de php para ir aprendiendo algo:

http://www.php.net/manual/es/ref.session.php

También podrias utilizar campos ocultos para ir guardando los datos.
Saludos.
  #3 (permalink)  
Antiguo 26/04/2006, 05:38
 
Fecha de Ingreso: enero-2005
Mensajes: 115
Antigüedad: 12 años, 10 meses
Puntos: 1
Gracias, me he mirado la especificacion de las funciones en la documentacion on-line de PHP y ya estoy trabajando en ello. Ya os dire si lo logro
__________________
SaRvErOk :ojotes:
  #4 (permalink)  
Antiguo 26/04/2006, 06:04
 
Fecha de Ingreso: enero-2005
Mensajes: 115
Antigüedad: 12 años, 10 meses
Puntos: 1
Exclamación Como deselecciono ahora los checkbox checked y que estan guardados en 1 var. session

Bien pues ya lo tengo listo, he hecho la paginacion de los resultados en PHP, he creado el formulario y la variable de session que recoge los datos pasados por POST que corresponen a los checkbox activados, asi ahora, puedo desplazarme por las paginas y ver los checkbox que ya habia seleccionado como estan marcados y los que todavia no he seleccionado como estan desmarcados, pero ahora me suge otra duda, como hago para que los checkbox que estan marcados dejen de estar marcados si los "deselecciono" osea si dejan de estar checked?
Alguna sugerencia? Gracias
PD. Tambien utilizo AJAX para cargar el formulario en la pagina web y para pasar entre las paginas o para ordenarlo por diferentes criterios. Vamos que cada vez que cargo el formulario por algun motivo lo hago con AJAX. (Solo algo de informacion complementaria)
__________________
SaRvErOk :ojotes:
  #5 (permalink)  
Antiguo 26/04/2006, 06:35
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 11 años, 7 meses
Puntos: 2
Bueno, no se como guardas la información de los checkbox seleccionados. En principio lo que deberias hacer es que cuando cambias de página, recorras las variables de sesion que indican si los checkbox de esa página estan seleccionados, y eliminar las que no hayan sido enviadas. Quizá si explicaras como lo implementaste podriamos ayudarte un poco más.
Saludos.
  #6 (permalink)  
Antiguo 26/04/2006, 06:58
 
Fecha de Ingreso: enero-2005
Mensajes: 115
Antigüedad: 12 años, 10 meses
Puntos: 1
Se trata de unos checkbox donde guardo un PATH de un archivo de manera que 'filepath'.'/'.'filename' todo esto concatenado es el value del checkbox.
Las variables de session las controlo asi:

Código PHP:
 //...
session_start();
if(isset(
$_SESSION['listadoCanciones'])){ //Si existe ...
    
$listadoCanciones $_SESSION['listadoCanciones'];
    if(isset(
$_POST['listadoCanciones']) && !empty($_POST['listadoCanciones'])){
        
$temp $_POST['listadoCanciones'];
        foreach(
$temp as $key => $valor)
            
$listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($valor))] = FixTextFields(getid3_lib::SafeStripSlashes($valor));
        unset(
$temp);
    }
    
$_SESSION['listadoCanciones'] = $listadoCanciones;
}else{ 
//Si no existe ...
    
if(isset($_POST['listadoCanciones']) && !empty($_POST['listadoCanciones'])){
        
$temp $_POST['listadoCanciones'];
        foreach(
$temp as $key => $valor)
            
$listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($valor))] = FixTextFields(getid3_lib::SafeStripSlashes($valor));
        unset(
$temp);
    }
    
$_SESSION['listadoCanciones'] = $listadoCanciones;
}
//... 
(FixTextFields y SafeStripSlashes son funciones para poder ver correctamente caracteres estraños)
De manera que cuando llego a los checkbox solo tengo que mirar si en la matriz $listadoCanciones esta la clave que busco o no:
asi por ejemplo:

Código PHP:
// ... bucle que recorre el mysql_fetch_array() devolviendo las tuplas seleccionadas
for ($i=0$row = @mysql_fetch_array($result);$i++){
echo 
'<tr>';
echo 
'<td align="right"><span class="letra_estandard">';//Checkbox para la seleccion de canciones
                
echo '<input type="checkbox" name="listadoCanciones[]" value="'.urlencode($row['filepath'].'/').urlencode($row['filename']).'" title="'.FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename'])).'" onfocus="this.style.border=\'1px solid #f00\'" onblur="this.style.border=\'1px solid #bbb\'"'.((isset($listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename']))])) ? '  checked' '').'>';
            echo 
'</span></td>';

//... mas campos y finaliza el bucle
echo '</tr>';

Cuando cambio de pagina a la pagina siguiente le paso por post los checkbox seleccionados, pero no le paso los checkbox no seleccionados.
No se me ocurre que hacer, seguramente tenga que cambiar la manera como paso la informacion de los checkbox. Que opinais??
__________________
SaRvErOk :ojotes:
  #7 (permalink)  
Antiguo 26/04/2006, 10:21
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 11 años, 7 meses
Puntos: 2
Lo que se me ocurre es que, por ejemplo, si muestras 10 checkbox en cada página, en la primera los nombres de estos sean listadoCanciones[1], listadoCanciones[2] .... hasta 10. En la segundo empezariamos por listadoCanciones[11] y asi. Cuando envias los datos tendrias que indicar de alguna manera desde cual página lo estas haciendo (pagina1, pagina2, etc). Asi, en la página que recibe los datos, según desde donde éstos se hayan enviado, podés saber si el intervalo debe ser de 1 a 10, de 11 a 20, etc. Entonces recorres ese intervalo verificando si para cada uno de los checkbox si ha sido seleccionado. Esto lo podés hacer con isset($_POTS['indice']). Si no ha sido seleccionado pero esta en la variable de sesión, deberias eliminarlo con unset($_SESSION['indice']).
Bueno, no se si me supe explicar. Es lo primero que se me ocurre, pero podría haber alguna otra forma mejor.
Saludos.
  #8 (permalink)  
Antiguo 26/04/2006, 10:51
 
Fecha de Ingreso: enero-2005
Mensajes: 115
Antigüedad: 12 años, 10 meses
Puntos: 1
De acuerdo Asunto arreglado

Bien, asunto arreglado, tu idea era buena Notwen pero no me servia, por que yo en mi tabla si le doy a los encabezados reorganizo todo denuevo segun el campo clickeado de la tabla de manera ASC o DESC, y entonces la paginas ya no necesariamente han de estar en el mismo orden, pero ya esta solucionado.
Lo que hago es que cuando en el sevidor se ejecuta el codigo PHP creo una variable de session 'listacheked' donde guardo los checkbox que hay cargados al cargar la pagina, entonces si borro alguno no se pasara por post a la siguiente pagina, con lo que aplicando el operador de diferencia array_diff_assoc obteno los campos que en un principio estaban checked en esa pagina y ya no lo estan, asi que me voy a la variable de session 'listadoCanciones' y simplemente hago un unset de los campos que no deverian estar, despues cargo en la variable 'listadoCanciones' los campos que he pasado por post y listo. No me importa si he cambiado el orden de mostrar los elementos al cargar la nueva pagina o si el orden de los elementos en la tabla que el usuario ve sigue igual. Funciona perfecto, eso si he desabilitado la funcion F5 de recargar la pagina mientras se insertan datos en el formulario.
Y aqui hos dejo el codigo (RESUMIDO) por si alguno tiene el mismo problema:
FixTextFields y SafeStripSlashes son funciones mias para tratar los caracteres raros.
Para tratar las sesiones al principio de la pagina:
Código PHP:
 //Principio del todo de la pagina, antes enviar los encabezados
session_start();
if(isset(
$_SESSION['listadoCanciones'])){ //Si existe ...
    
$listadoCanciones $_SESSION['listadoCanciones'];
    if(isset(
$_POST['listadoCanciones']) && !empty($_POST['listadoCanciones'])){
        
$temp $_POST['listadoCanciones'];
        if(isset(
$_SESSION['listachecked']) && !empty($_SESSION['listachecked'])){
            
$array_nochecked array_diff_assoc($_SESSION['listachecked'], $temp); //Escogemos las op. que estaban checked y ya no estan
            
foreach($array_nochecked as $key => $valor){
                 if(isset(
$listadoCanciones[$valor]))
                    unset(
$listadoCanciones[$valor]); //Eliminamos del listado las canciones des-checkeadas
            
}
            unset(
$array_nochecked);
            unset(
$_SESSION['listachecked']);
        }
        foreach(
$temp as $key => $valor)
            
$listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($valor))] = FixTextFields(getid3_lib::SafeStripSlashes($valor));
        unset(
$temp);
    }else{ 
//Si no hay variables pasadas por post ... (no hay variables checkeadas en la ultima pagina
        
if(isset($_SESSION['listachecked']) && !empty($_SESSION['listachecked'])){
            
$array_nochecked $_SESSION['listachecked']; //Escogemos todas las op. que estaban checked
            
foreach($array_nochecked as $key => $valor){
                 if(isset(
$listadoCanciones[$valor]))
                    unset(
$listadoCanciones[$valor]); //Eliminamos del listado las canciones des-checkeadas
            
}
            unset(
$array_nochecked);
            unset(
$_SESSION['listachecked']);
        }
    }
    
$_SESSION['listadoCanciones'] = $listadoCanciones;
}else{ 
//Si no existe no hay canciones chekeadas previamente ...
    
if(isset($_POST['listadoCanciones']) && !empty($_POST['listadoCanciones'])){
        
$temp $_POST['listadoCanciones'];
        foreach(
$temp as $key => $valor)
            
$listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($valor))] = FixTextFields(getid3_lib::SafeStripSlashes($valor));
        unset(
$temp);
    }
    
$_SESSION['listadoCanciones'] = $listadoCanciones;
}
// .... que si includes, scripts, body ... que si consulta SQL, que si otras cosas que obviamos
echo '<table .....>';
<
thead>
//encabezado que tmb pasamos de el
echo '</thead>';
echo 
'<tbody>'//Entre <tbody> y </tbody> ponemos los datos de la tabla ordenada
    
$listachecked = array();
  for (
$i=0$row = @mysql_fetch_array($result);$i++){ //Para cada fila devuelta de la consulta ... 
echo '<tr>';
echo 
'<td>';
echo 
'<input type="checkbox" name="listadoCanciones[]" value="'.urlencode($row['filepath'].'/').urlencode($row['filename']).'" title="'.FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename'])).'" onfocus="this.style.border=\'1px solid #f00\'" onblur="this.style.border=\'1px solid #bbb\'"'.((isset($listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename']))])) ? '  checked' '').'>';
            if(isset(
$listadoCanciones[FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename']))]))
                
$listachecked[FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename']))] = FixTextFields(getid3_lib::SafeStripSlashes($row['filepath'].'/'.$row['filename']));
            echo 
'</span></td>';

// ... más columnas dentro de la misma fila ... y esas cosas ...
echo '</tr>';
//Cerramos el hermoso for que hace las filas
  
if(!empty($listachecked)) $_SESSION['listachecked'] = $listachecked;
echo 
'<tr><td colspan="7">
 //aqui van los botones o lo que sea para enviar el formulario
echo '
</tr></td>';
echo '
</tbody>';
//AQUI iria otra tablita donde meteriamos la funcion para paginar los resultados tal y como es en google << 1 2 3 4 .... >> que nos saltamos
echo '
</form></table>;
// .. que si mysql_free_result, que si mysql_close, que si mas funciones, bla bla bla que tmb obviamos y ya esta :-) 
Gracias por la colaboracion y espero que os sirva a alguno mas de ayuda
__________________
SaRvErOk :ojotes:
  #9 (permalink)  
Antiguo 26/04/2006, 11:19
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 11 años, 7 meses
Puntos: 2
Deberias separar el codigo que guarda los checkbox que van siendo seleccionados del codigo que muestra el formulario en dos páginas distintas. De esa manera, deberias enviar los datos a una nueva página guardardatos.php que sólo realice eso: guardar los datos de los checkbox seleccionados y luego redirigir nuevamente a la página del formulario. El script para guarda los datos seria más o menos así:

guardardatos.php:
Código PHP:
<?
session_start
();
//Aca colocas el codigo que actualiza la variable de sesion que contiene los checkbox seleccionados
header("Location: formulario.php?pag=numero"); //Redirige al formulario que muestra los checkbox
?>
De esta forma, no tendrías problemas si alguien intenta recargar la página del formulario.
Saludos.
  #10 (permalink)  
Antiguo 26/04/2006, 11:27
 
Fecha de Ingreso: enero-2005
Mensajes: 115
Antigüedad: 12 años, 10 meses
Puntos: 1
Ok, gracias, lo haré.
__________________
SaRvErOk :ojotes:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:32.