Foros del Web » Programando para Internet » PHP »

Paginación de resultados

Estas en el tema de Paginación de resultados en el foro de PHP en Foros del Web. Hola, es la primera vez que escribo en este foro pero os leo hace bastante tiempo. Tiene una FAQ bastante buena. Os cuento mi problema: ...
  #1 (permalink)  
Antiguo 09/08/2004, 10:41
 
Fecha de Ingreso: agosto-2004
Mensajes: 36
Antigüedad: 20 años, 3 meses
Puntos: 0
Paginación de resultados

Hola, es la primera vez que escribo en este foro pero os leo hace bastante tiempo. Tiene una FAQ bastante buena.

Os cuento mi problema:

Tengo esta función:
Código:
//-----------------------------------------------------
// Funcion que lista los mensajes del mailbox
//-----------------------------------------------------
function listar_mails($imap, $pagina)
	{
	//***************************************************
	// INICIO DEL PAGINADOR DE RESULTADOS
	//***************************************************
	
	//limite de busqueda
	$resultados = 10;
	$result = 10;
	$limite = imap_num_msg($imap);
	if (!$pagina) {
    $inicio = 1;
    $pagina = 1;
		}
	else {
    $inicio = ($pagina - 1) * $resultados;
    $resultados = $resultados + $resultados;
    if ($resultados > $limite)
    	{
    	$resultados = $limite;
    	}
		} 
	// total paginas
	$total_mails = imap_num_msg($imap);
	$total_paginas = ceil($total_mails / $result);
	// paginador
	if ($total_paginas > 1){
    for ($i=1;$i<=$total_paginas;$i++){
       if ($pagina == $i)
          //si muestro el índice de la página actual, no coloco enlace
          echo "<tr bgcolor=#FFFF80><td colspan=7>$pagina ";
       else
          //si el índice no corresponde con la página mostrada actualmente, coloco el enlace para ir a esa página
          echo "<a href=members_only.php?pagina=$i>" . $i . "</a></td></tr> ";
    }
}
echo "	<tr bgcolor=#3F7FF4>
<td></td><td >Nº</td><td>Estado</td><td>Fecha:</td><td>Asunto:</td><td>Enviado por:</td><td>Tamaño:</td>
	</tr>";
//******************************************************
// FIN DEL PAGINADOR DE RESULTADOS
//******************************************************

for ($i = $inicio; $i <= $resultados; $i++)
{
  $header = imap_headerinfo($imap, $i, 80, 80);
  $fromaddress[$i] = $header->from[0]->host;
  $fromname[$i] = $header->from[0]->mailbox;
  $from[$i]= $fromname[$i]."@".$fromaddress[$i];

  $subject[$i] = $header->fetchsubject;
  $size[$i] = $header->Size;
  $maildate[$i] = $header->Date;
  $recent[$i] = $header->Recent;
  $unseen[$i] = $header->Unseen;
  $msgno[$i] = $header->Msgno;
  // Acortamos la fecha de los mails
  $date = substr($maildate[$i], 0, 16);
  // Pasa el tamaño a Kb
  $size[$i] = ($size[$i]/1024);
  $size[$i] = substr($size[$i], 0, 3);
   if ($i%2)
  	{$color = "#ffffff";}
	else
	{$color = "cccccc";}
print "<tr bgcolor=$color>
<td><INPUT type=CHECKBOX name=delete[$i] value=".$msgno[$i]."></td>
	<td>".$msgno[$i]."</td>
	<td>".$recent[$i]."</td>
	<td>".$date."</td>
	<td><a href='members_only.php?id=leer&msgnumber=$i'>".$subject[$i]."</a></td>
	<td><a href='members_only.php?id=leer&msgnumber=$i'>".$from[$i]."</a></td>
	<td>".$size[$i]."</td>
	
	</tr>";
	
}
	}
Tal y como esta la función ahora funciona bien mostrando el paginador tipo "paginas: 1 2 3 etc..." Lo que me gustaria hacer es que solo apareciera un "<< atras y siguiente >>" pero no se muy bien como hacerlo...

Espero podais darme alguna idea o algo por donde empezar a mirar. Gracias de antemano.
  #2 (permalink)  
Antiguo 09/08/2004, 17:03
Avatar de living  
Fecha de Ingreso: mayo-2004
Mensajes: 1.266
Antigüedad: 20 años, 6 meses
Puntos: 2
yo sustituiría este for:

Código PHP:
for ($i=1;$i<=$total_paginas;$i++){
       if (
$pagina == $i)
          
//si muestro el índice de la página actual, no coloco enlace
          
echo "<tr bgcolor=#FFFF80><td colspan=7>$pagina ";
       else
          
//si el índice no corresponde con la página mostrada actualmente, coloco el enlace para ir a esa página
          
echo "<a href=members_only.php?pagina=$i>" $i "</a></td></tr> ";
    } 
por esto:
Código PHP:
if ($pagina>1){
    echo 
"<a href=members_only.php?pagina=($pagina-1)>&lt;&lt;atrás</a></td></tr> ";
}
if (
$pagina<$total_paginas){
    echo 
"<a href=members_only.php?pagina=($pagina-1)>siguiente &gt;&gt;</a></td></tr> ";

__________________
¿Te apasiona el mundo del guión? El portal del guión
  #3 (permalink)  
Antiguo 09/08/2004, 17:17
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 2 meses
Puntos: 41
También puedes ver mi script de paginación, muy sencillo y muy parecido a lo que tú utilizas. Sólo pones include("paginator.inc.php"); y ya está!
http://jpinedo.webcindario.com

Saludos
  #4 (permalink)  
Antiguo 10/08/2004, 09:43
 
Fecha de Ingreso: agosto-2004
Mensajes: 36
Antigüedad: 20 años, 3 meses
Puntos: 0
Gracias por las respuestas, al final lo resolvi del siguiente modo. De todas formas tiene un pequeño problema que no se como voy a solucionar.

Código:
<?
	//***************************************************
	// INICIO DEL PAGINADOR DE RESULTADOS
	//***************************************************
	
	//limite de busqueda
	$resultados = 10;
	$result = 10;
	$limite = imap_num_msg($imap);
	if (!$pagina) 
	{
    	$inicio = 1;
    	$pagina = 1;
	}
	else 
	{
    	$inicio = ($pagina - 1) * $resultados;
     	$resultados = $resultados * $pagina;
    	if ($resultados > $limite)
    		{
    		$resultados = $limite;
    		}
  } 
	// total paginas
	$total_mails = imap_num_msg($imap);
	echo $total_mails;
	$total_paginas = ceil($total_mails / $result);
	// paginador
	if ($pagina>1)
		{
		$pagina = $pagina-1;
		echo "<tr><td><a href=members_only.php?pagina=$pagina>&lt;&lt;atrás</a></td>";
                // si no sumamos 1 a $pagina en el siguiente if () $pagina sera igual al anterior ya que lo resta mas arriba.
		$pagina = $pagina+1;
		}
				else
		{
		echo "<tr><td>&lt;&lt; atrás</td>";
		}
	if ($pagina<$total_paginas)
		{
		echo $pagina;
		$pagina = $pagina+1;
		echo "<td><a href=members_only.php?pagina=$pagina>siguiente &gt;&gt;</a></td><tr>";
		}
		else
		{
		echo "<td>siguiente &gt;&gt;</td><tr>";
		}
//******************************************************
// FIN DEL PAGINADOR DE RESULTADOS
//******************************************************
?>
El problema viene cuando avanzas una pagina o dos y luego retrocedes hasta la primera pagina, $inicio toma el valor 0 por lo que el bucle empiza a leer cabeceras de mensajes desde el mensaje 0 el cual no existe (los mails empiezan a numerarse desde 1, por eso el valor inicial de $inicio es 1) por lo que da un error y me muestra una entrada vacia. Intente con un if ($inicio = 0){$inicio+1;} pero fue a peor.

Escepto por ese pequeño detalle el resto esta perfecto, era lo que queria hacer, gracias a los dos por la ayuda.

PD: ¿Comó se pone el código a color?
__________________
Como aquel que calla otorga y aunque la ignorancia es sorda pude levantar la voz, más fuerte que los ladridos de los perros consentidos y que la voz del pastor.

Última edición por E*M*P*I*C*A*L; 10/08/2004 a las 09:49
  #5 (permalink)  
Antiguo 10/08/2004, 18:07
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 2 meses
Puntos: 41
Para poner el código a color utiliza las etiquetas [PHP] en lugar de [CODE].
En algún momento tuve el mismo problema que tú con mi script. Te repito que le des una mirada ya que el código está bien comentado así que no te perderás en ningún momento. Además es pequeñito y no te va a tomar nada revisarlo.
Mira en la generación de enlaces de mi scrip. La solución viene siendo algo como lo que te puso living.

saludos
  #6 (permalink)  
Antiguo 10/08/2004, 18:10
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 2 meses
Puntos: 41
Ok... este es uno de los post de donde surgió mi script y justamente aquí resolví el problema de la cuenta que empieza desde cero. Claro que el código no está tan comentado como en el script final... pero creo que se entiende lo suficiente.

http://www.forosdelweb.com/showpost....72&postcount=9

Saludos
  #7 (permalink)  
Antiguo 11/08/2004, 12:39
 
Fecha de Ingreso: agosto-2004
Mensajes: 36
Antigüedad: 20 años, 3 meses
Puntos: 0
Consegui solucuionar el problema:

Código PHP:
    {
    
//***************************************************
    // INICIO DEL PAGINADOR DE RESULTADOS
    //***************************************************
    
    //limite de busqueda
    
$resultados 10;
    
$result 10;
    
$limite imap_num_msg($imap);
    if (!
$pagina
    {
         
// Valores iniciales
        
$inicio 0;
        
$pagina 1;
    }
    else 
    {
        
$inicio = ($pagina 1) * $resultados;
         
$resultados $resultados $pagina;
        if (
$resultados $limite)
            {
            
$resultados $limite;
            }
  } 
    
// total paginas
    
$total_mails imap_num_msg($imap);
    
$total_paginas ceil($total_mails $result);
    
// paginador
    
echo "<tr><td colspan=5>Tienes <b>$total_mails</b> mails en <b>INBOX</b>, visualizando mensajes desde el <b>$inicio</b> al <b>$resultados</b></td>";
    if (
$pagina>1)
        {
        
$pagina --;
        echo 
"<td colspan=2><a href=members_only.php?pagina=$pagina>  &lt;&lt;atrás </a>";
        
$pagina ++;
        }
        else
        {
        echo 
"<td colspan=2>&lt;&lt; atrás ";
        } 
    if (
$pagina<$total_paginas)
        {
        
$pagina ++;
        echo 
"<a href=members_only.php?pagina=$pagina>- siguiente &gt;&gt;</a></td></tr>";
        }
        else
        {
        echo 
"- siguiente &gt;&gt;</td></tr>";
        }
// Incremento de la variable $inicio                
$inicio ++;
//******************************************************
// FIN DEL PAGINADOR DE RESULTADOS
//******************************************************
echo "    <tr bgcolor=#3F7FF4>
<td></td><td >Nº</td><td>Estado</td><td>Fecha:</td><td>Asunto:</td><td>Enviado por:</td><td>Tamaño:</td>
    </tr>"
;

for (
$i $inicio$i <= $resultados$i++)

Lo único que hice fue poner el valor inicial de $inicio a 0 e incerementar $inicio antes del for con $inicio ++;

Gracias por vuestra ayuda :)
__________________
Como aquel que calla otorga y aunque la ignorancia es sorda pude levantar la voz, más fuerte que los ladridos de los perros consentidos y que la voz del pastor.
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 14:41.