Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] poner puntos suspensivos en paginador php pdo

Estas en el tema de poner puntos suspensivos en paginador php pdo en el foro de PHP en Foros del Web. Hola, Hice un paginador en PDO para poder visualizar registros de la base de datos de 20 en 20, funciona perfecto pero al momento de ...
  #1 (permalink)  
Antiguo 31/12/2019, 10:47
 
Fecha de Ingreso: noviembre-2015
Mensajes: 70
Antigüedad: 4 años, 2 meses
Puntos: 2
poner puntos suspensivos en paginador php pdo

Hola,
Hice un paginador en PDO para poder visualizar registros de la base de datos de 20 en 20, funciona perfecto pero al momento de cargar 5000 registros en la base de datos, el paginador se me llena de cuadritos con el numero correspondiente a cada pagina y se me crean alrededor de 2000 cuadritos de paginas, he visto que muchas paginas tienen paginadores que funcionan de la siguiente forma:
Previus 1 2 3 .... 109 110 111 Next. Y es exacto lo que quiero, poner puntos suspensivos entre los cuadritos del paginador para que no se me llene de cuadritos el footer y ademas, se ve mal presentado.
Este es mi codigo del paginador:
Código PHP:
$pdo = new PDO("pgsql:dbname=latamcustomercloud;host=localhost"'postgres''madison' );

$sql 'SELECT * FROM company_main';
$sentence $pdo->prepare($sql);
$sentence->execute();
$result $sentence->fetchAll();

$record_by_page 20;
$total_records $sentence->rowCount();
$page $total_records/20;
$page ceil($page); 
Con lo anterior, inicio la conexion y la consulta a la base de datos, a continuacion el codigo de paginacion
Código PHP:
 if (!$_GET) {
               header('Location:ordinaryConsultant.php?page=1');
              }

              $starting = ($_GET['page']-1)*$record_by_page;

                    $sqlRec = 'SELECT * FROM company_main limit :nrecord OFFSET :starting';
                    $sentenceRec = $pdo->prepare($sqlRec);
                    $sentenceRec->bindParam(':starting', $starting, PDO::PARAM_INT);
                    $sentenceRec->bindParam(':nrecord', $record_by_page, PDO::PARAM_INT);
                    $sentenceRec->execute();
                    $resultRec = $sentenceRec->fetchAll();
                    
         ?>
            <div class="registros" id='agrega-registros' style="background-color: #35889936;">
              <?php foreach ($resultRec as $fila): ?>
            <div class='registros' style='background-color: #35889936; color: #FFF;'>
              <?php echo "ID: ".$fila['0']; 
                    echo 
"</br>";
                    echo 
"Company Name: ".$fila['1']; 
                    echo 
"</br>";
                    echo 
"Activity Description: ".$fila['6']; 
                    echo 
"</br>";
                    echo 
"Public or Private: ".$fila['8'];
                    echo 
"</br>";
                    echo 
"Address HQ: ".$fila['9'];
                    echo 
"</br>";
                    echo 
"Is Client: ".$fila['10'];
                    echo 
"</br>";
                    echo 
"Vigency: ".$fila['12']; ?>
            </div>
              <?php endforeach ?>
            </div> 
</form>
<nav aria-label="Page navigation example">
  <ul class="pagination">
    <li class="page-item <?php echo $_GET['page']<='disabled':'' ?>"><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $_GET['page']-1 ?>">Previous</a></li>
    <?php for ($i 0$i $page;$i++):?>
    <li class="page-item <?php echo $_GET['page']==$i+'active' '' ?> "><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $i+1?>"> <?php echo $i+1?> </a></li>
  <?php endfor; ?>
    <li class="page-item <?php echo $_GET['page']>=$page 'disabled':'' ?> "><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $_GET['page']+1 ?>">Next</a></li>
  </ul>
</nav>
Alguien me puede ayudar a complementarlo para que no me aparezcan como un millon de cuadritos de paginas por favor?.
__________________
paco alonso
  #2 (permalink)  
Antiguo 31/12/2019, 11:19
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.994
Antigüedad: 11 años, 5 meses
Puntos: 2194
Respuesta: poner puntos suspensivos en paginador php pdo

Te ayudo con la lógica:

Cuántos enlaces vas a mostrar?, digamos que 20, toma la página actual y réstale 10

Código:
inicio = pagActual - 10
si(inicio < 1) {
    inicio = 1
}
fin = inicio + 20
si(fin > paginaMaxima) {
    fin = paginaMaxima
    inicio = fin - 20
}
1. Enlace a página inicial y anterior solo si no estás en la primera página
2. Muestra los enlaces disponibles con for(i = inicio, i <= fin, i++)
3. Enlace a página siguiente y final solo si no estás en la última página
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 31/12/2019, 12:02
 
Fecha de Ingreso: noviembre-2015
Mensajes: 70
Antigüedad: 4 años, 2 meses
Puntos: 2
Respuesta: poner puntos suspensivos en paginador php pdo

Cita:
Iniciado por Triby Ver Mensaje
Te ayudo con la lógica:

Cuántos enlaces vas a mostrar?, digamos que 20, toma la página actual y réstale 10

Código:
inicio = pagActual - 10
si(inicio < 1) {
    inicio = 1
}
fin = inicio + 20
si(fin > paginaMaxima) {
    fin = paginaMaxima
    inicio = fin - 20
}
1. Enlace a página inicial y anterior solo si no estás en la primera página
2. Muestra los enlaces disponibles con for(i = inicio, i <= fin, i++)
3. Enlace a página siguiente y final solo si no estás en la última página
Gracias, de hecho asi es como funciona el paginador que hice, pero lo que no entiendo es en donde voy a poner los puntos suspensivos, es deicr; el paginador ya trabaja bien, pero si tengo mas de 1000 registros lo que va a hacer es colocar mas paginas y no quiero que ponga todas las paginas, solo quiero que muestre la pagina 1, 2, 3 ... 99, 100, 101. No se si la logica que me compartes hace esto.
__________________
paco alonso
  #4 (permalink)  
Antiguo 31/12/2019, 12:41
Avatar de petit89  
Fecha de Ingreso: marzo-2011
Mensajes: 1.034
Antigüedad: 8 años, 10 meses
Puntos: 150
Respuesta: poner puntos suspensivos en paginador php pdo

segun veo obtienes con
$starting = ($_GET['page']-1)
la pagina actual...

ahora trabajas con ese valor... por ejemplo: si pagina actual es 15

$menor = $actual - 10;
$mayor = $actual + 10;

for($i=$actual;$i=$menor;$i--) asi ira... 14, 13, 12, 11, 10... etc hasta llegar a 5(que es 15-10)
for($i=$actual;$i=$menor;$i++) asi ira... 16, 17, 18, 19, 20... etc hasta llegar a 25(que es 15+10)

espero haberte aclarado la idea que te dejo Triby, todo esque jueges con los numeros e intervalos entre estos
__________________
█ WebHosting / Reseller a bajo costo | Uptime Garantizado | Soporte en Español e Ingles
¿Te sirvió la respuesta? Deja un +1 (Triangulo negro al lado derecho)
  #5 (permalink)  
Antiguo 02/01/2020, 17:52
 
Fecha de Ingreso: noviembre-2015
Mensajes: 70
Antigüedad: 4 años, 2 meses
Puntos: 2
Respuesta: poner puntos suspensivos en paginador php pdo

Cita:
Iniciado por petit89 Ver Mensaje
segun veo obtienes con
$starting = ($_GET['page']-1)
la pagina actual...

ahora trabajas con ese valor... por ejemplo: si pagina actual es 15

$menor = $actual - 10;
$mayor = $actual + 10;

for($i=$actual;$i=$menor;$i--) asi ira... 14, 13, 12, 11, 10... etc hasta llegar a 5(que es 15-10)
for($i=$actual;$i=$menor;$i++) asi ira... 16, 17, 18, 19, 20... etc hasta llegar a 25(que es 15+10)

espero haberte aclarado la idea que te dejo Triby, todo esque jueges con los numeros e intervalos entre estos
No me sale, le puse este codigo para que corte el numero de cuadros pero lo unico que hace es que solo aparece la pagina 1, al darle next aparecen la pagina 1 y 2, al volver a dar next, aparecen la pagina 1, 2, 3. le agregue un if y le puse un break al if
Código PHP:
<?php for ($i 0$i $page$i++):?>
      <?php if ($i >= $_GET['page']): break; endif; ?>

    <li class="page-item <?php echo $_GET['page']==$i+'active' '' ?> "><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $i+1?>"> <?php echo $i+1?> </a>
    </li>
  <?php endfor; ?>
__________________
paco alonso
  #6 (permalink)  
Antiguo 02/01/2020, 18:03
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.994
Antigüedad: 11 años, 5 meses
Puntos: 2194
Respuesta: poner puntos suspensivos en paginador php pdo

Claro, estás cortando el ciclo cuando muestras el enlace a la página actual en lugar de establecer el inicio y final con variables.

Código PHP:
Ver original
  1. <?php
  2. // Total de enlaces a mostrar
  3. $mostrar = 20;
  4. // Calcular el inicio:
  5. $inicio = $_GET['page'] - round($mostrar / 2);
  6. if($inicio < 1) {
  7.     $inicio = 1;
  8. }
  9. // Calcular final
  10. $fin = $inicio + $mostrar;
  11. if($fin > $page) {
  12.     $fin = $page; // Creo que en $page es donde tienes el máximo de páginas
  13.     $inicio = $fin - $mostrar;
  14. }
  15.  
  16. if($_GET['page'] > 1) {
  17.     // Aquí pones enlace a primera página y anterior
  18. }
  19. if($inicio > 1) {
  20.     // Aquí pones los puntos suspensivos del principio
  21. }
  22. for($i = $inicio; $i <= $fin; $i++) {
  23.     // Aquí van los enlaces normales
  24. }
  25. if($fin < $page) {
  26.     // Puntos suspensivos del final
  27. }
  28. if($_GET['page'] < $page) {
  29.     // Enlace a página siguiente y final
  30. }
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 06/01/2020, 17:49
 
Fecha de Ingreso: noviembre-2015
Mensajes: 70
Antigüedad: 4 años, 2 meses
Puntos: 2
Respuesta: poner puntos suspensivos en paginador php pdo

Cita:
Iniciado por Triby Ver Mensaje
Claro, estás cortando el ciclo cuando muestras el enlace a la página actual en lugar de establecer el inicio y final con variables.

Código PHP:
Ver original
  1. <?php
  2. // Total de enlaces a mostrar
  3. $mostrar = 20;
  4. // Calcular el inicio:
  5. $inicio = $_GET['page'] - round($mostrar / 2);
  6. if($inicio < 1) {
  7.     $inicio = 1;
  8. }
  9. // Calcular final
  10. $fin = $inicio + $mostrar;
  11. if($fin > $page) {
  12.     $fin = $page; // Creo que en $page es donde tienes el máximo de páginas
  13.     $inicio = $fin - $mostrar;
  14. }
  15.  
  16. if($_GET['page'] > 1) {
  17.     // Aquí pones enlace a primera página y anterior
  18. }
  19. if($inicio > 1) {
  20.     // Aquí pones los puntos suspensivos del principio
  21. }
  22. for($i = $inicio; $i <= $fin; $i++) {
  23.     // Aquí van los enlaces normales
  24. }
  25. if($fin < $page) {
  26.     // Puntos suspensivos del final
  27. }
  28. if($_GET['page'] < $page) {
  29.     // Enlace a página siguiente y final
  30. }
mmmm NO, no me sale, ahora me pagina desde el -9,-8,-7,-6,-5,-4,-3,-2,-1, 0 1, 2, 3, 4, 5, 6, 7, 8, 9.
Código PHP:
<?php 
          
if (!$_GET) {
               
header('Location:ordinaryConsultant.php?page=1');
              }
              
$inicio $_GET['page'] - round($record_by_page 2);
              
$starting = ($_GET['page']-1)*$record_by_page;
              if(
$inicio 1) {
                
$inicio 1;
              }
              
$fin $inicio $record_by_page;
              if(
$fin $page) {
                  
$fin $page// Creo que en $page es donde tienes el máximo de páginas
                  
$inicio $fin $record_by_page;
              }
                    
$sqlRec 'SELECT cm.*, pgc.* FROM company_main cm, parent_group_catalog pgc where cm.parentgroup = pgc.groupID limit :nrecord OFFSET :starting';
                    
$sentenceRec $pdo->prepare($sqlRec);
                    
$sentenceRec->bindParam(':starting'$startingPDO::PARAM_INT);
                    
$sentenceRec->bindParam(':nrecord'$record_by_pagePDO::PARAM_INT);
                    
$sentenceRec->execute();
                    
$resultRec $sentenceRec->fetchAll();
                    
         
?>
            <div class="registros" id='agrega-registros' style="background-color: #35889936;">
              <?php foreach ($resultRec as $fila): ?>
            <div class='registros' style='background-color: #35889936; color: #FFF;'>
              <?php echo "ID: ".$fila['0']; 
                    echo 
"</br>";
                    echo 
"Company Name: ".$fila['1']; 
                    echo 
"</br>";
                    echo 
"Activity Description: ".$fila['6']; 
                    echo 
"</br>";
                    echo 
"Public or Private: ".$fila['8'];
                    echo 
"</br>";
                    echo 
"Address HQ: ".$fila['9'];
                    echo 
"</br>";
                    echo 
"Parent Group: ".$fila['14']; 
                    echo 
"</br>";
              
?>
                    <?php if ($fila['10']==true): ?>
                      <?php echo "Is Client: Yes"?>
                      <?php else: echo "Is Client: No"?>
                    <?php endif ?>
              <?php 
                    
echo "</br>";
                    echo 
"Country: ".$fila['5'];
                    echo 
"</br>";
                    echo 
"GRP TaxID: ".$fila['16'];
                    echo 
"</br>";
                    echo 
"Activities: ".$fila['18'];
                    echo 
"</br>";
                    echo 
"Tax ID: ".$fila['3']; 
              
?>
            </div>
              <?php endforeach ?>
            </div> 
</form>


<?php 
if($_GET['page'] > 1): ?>
<nav aria-label="Page navigation example">
  <ul class="pagination">
    <li class="page-item <?php echo $_GET['page']<='hidden':'' ?>"><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $_GET['page']-1 ?>">Previous</a>
    </li>
<?php endif; ?>
<?php 
if($inicio 1):  ?>  
    <span>...</span>
<?php endif; ?>
<?php   
for($i $inicio$i <= $fin$i++): ?>
    <li class="page-item <?php echo $_GET['page']==$i+'active' '' ?> "><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $i+1?>"> <?php echo $i+1?> </a>
    </li>
<?php endfor; ?>
<?php   
if($fin $page): ?>
    <span>...</span>
<?php endif; ?>
<?php 
if($_GET['page'] < $page): ?>
   <li class="page-item <?php echo $_GET['page']>=$page 'hidden':'' ?> "><a class="page-link" href="ordinaryConsultant.php?page=<?php echo $_GET['page']+1 ?>">Next</a></li>
  </ul>
</nav>
<?php endif; ?>
__________________
paco alonso
  #8 (permalink)  
Antiguo 07/01/2020, 09:36
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.994
Antigüedad: 11 años, 5 meses
Puntos: 2194
Respuesta: poner puntos suspensivos en paginador php pdo

Parece que estás haciendo el ejercicio con menos de 20 páginas o estás usando la variable equivocada para los cálculos... o ambas!

Código PHP:
Ver original
  1. // Conviene tener la página actual en una variable
  2.     // Si no se especificó en URL, entonces es 1 por default
  3.     $page_current = (isset($_GET['page'])) ? (int) $_GET['page'] : 1;
  4.     // También hay que validar que esté dentro de los límites
  5.     if($page_current < 1) {
  6.          $page_current = 1;
  7.     }
  8.     if($page_current > $page) {
  9.         $page_current = $page;
  10.     }
  11.  
  12.     // Esta es la cantidad máxima de enlaces a mostrar
  13.     $max_links = 20;
  14.  
  15.     // Sigo suponiendo que en $page tienes el máximo de páginas
  16.     if($page <= $max_links) {
  17.           // Si tienes menos enlaces que los que "deseas" mostrar
  18.           $inicio = 1;
  19.           $fin = $page;
  20.     } else {
  21.               $inicio = $page_current - round($max_links / 2);
  22.               if($inicio < 1) {
  23.                     $inicio = 1;
  24.               }
  25.               $fin = $inicio + $max_links;
  26.               if($fin > $page) {
  27.                   $fin = $page; // Creo que en $page es donde tienes el máximo de páginas
  28.                   $inicio = $fin - $max_links;
  29.                   // Verificar si inicio es menor que uno???
  30.               }
  31.     }
  32.     // Es mejor dejar siempre el número de página intacto
  33.     // y calcular el inicio adecuado para los resultados (offset)
  34.    $starting = ($page_current * $record_by_page) - $record_by_page;
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 08/01/2020, 09:08
 
Fecha de Ingreso: noviembre-2015
Mensajes: 70
Antigüedad: 4 años, 2 meses
Puntos: 2
Respuesta: poner puntos suspensivos en paginador php pdo

ya quedo, gracias; aunque tuve que bajar el numero de registros mostrados a 10 para una mejor visualizacion.
Te agradezco mucho tu apoyo.
Saludos.
__________________
paco alonso



La zona horaria es GMT -6. Ahora son las 08:43.