PHP - Acortar páginación

 
Vista:
sin imagen de perfil

Acortar páginación

Publicado por Jordi (6 intervenciones) el 14/09/2022 19:02:07
Hola,
Tengo una paginación en PDO cual muestra la paginación así:

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20

Me gustaría acortarlo tipo así:

1 | 2 | 3 | ... | 18 | 19 | 20

Alguna idea de como podría implementarlo en mi código? Gracias de antemano.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$perPage = 12;
	if($result["url"] == "informatica") { $search = "WHERE cat LIKE '%Accesorios para PC Gaming%' OR cat LIKE '%Almacenamiento%' OR cat LIKE '%Componentes de PC%' OR cat LIKE '%Conectividad y redes%' OR cat LIKE '%Estabilizadores y UPS%' OR cat LIKE '%Impresión%' OR cat LIKE '%Ordenadores portátiles y accesorios%' OR cat LIKE '%Lectores y escáneres%' OR cat LIKE '%Monitores y accesorios%' OR cat LIKE '%Periféricos de PC%' OR cat LIKE '%Proyectores y pantallas%' OR cat LIKE '%Tablets y accesorios%'"; }
	if($result["url"] == "componentes-de-pc") { $search = "WHERE cat LIKE '%Componentes%'"; }
										   $stmt = $pdo->prepare("SELECT count(*) as num_rows FROM products $search");
		$stmt->execute();
		$row = $stmt->fetch(PDO::FETCH_ASSOC);
        $total_results = $row['num_rows'];
 
    $total_pages = ceil($total_results / $perPage);
 
    // Current page
    $page = isset($_GET['page']) ? $_GET['page'] : 1;
    $starting_limit = ($page - 1) * $perPage;
	$stmt1 = $pdo->prepare("SELECT name,img,id FROM products $search ORDER BY id DESC LIMIT $starting_limit,$perPage");
	$stmt1->execute();
 
 
 
	while ($i = $stmt1->fetch(PDO::FETCH_ASSOC)) {
	$a = $pdo->prepare("SELECT shop_id, url, MIN(pvp) as minimo FROM products_shops WHERE product_id=".$i["id"]."");
	$a->execute();
		$a = $a->fetch(PDO::FETCH_ASSOC);
		$b = $pdo->prepare("SELECT shop_name FROM shops WHERE id=".$a["shop_id"]."");
	$b->execute();
		$b = $b->fetch(PDO::FETCH_ASSOC);
 
		$count = $pdo->prepare("SELECT COUNT(*) as num_rows FROM products_shops WHERE product_id=".$i["id"]."");
		$count->execute();
		$row = $count->fetch(PDO::FETCH_ASSOC);
        $totalRowCount = $row['num_rows'];
		?>
	<div class="widget">
    <div class="widgetImage animation">
      <img src="<?php echo $i["img"]; ?>" alt="<?php echo $i["name"]; ?>" />
    </div>
    <div class="widgetContent animation">
		<span class="cap t12 bold"><?php echo decrypt($b["shop_name"],$key); ?></span>
      <h2 class="widgetTitle"><?php echo substr($i["name"], 0, 77); if(strlen($i["name"]) > 77) { echo "..."; } ?></h2>
 
		<span class="price t18 bold"><?php echo $a["minimo"]; ?></span><span class="t11 right1">(Envío incluido)</span><br/><div class="sop"><?php if($totalRowCount>1) { ?><span class="icon-check green t16"></span> <?php } ?>
		<span class="t12"><?php if($totalRowCount>1) { ?>El precio más bajo<?php } else { ?>Único precio disponible<?php } ?></span></div>
		<br/><br/><a href="<?php echo $a["url"]; ?>" target="_blank" title="<?php if($totalRowCount>1) { ?>Ir a la mejor oferta<?php } else { ?>Ir a la oferta<?php } ?>" rel="nofollow"><div class="snd"><?php if($totalRowCount>1) { ?>Ir a la mejor oferta<?php } else { ?>Ir a la oferta <?php } ?></div></a><hr/>
		<div class="snd2">
		<?php if($totalRowCount>1) { ?><b>Ver</b> las <b><?php echo $totalRowCount; ?></b> tiendas <?php } else { ?> Ver producto en <b><?php echo substr(decrypt($b["shop_name"],$key), 0, 13); if(strlen(decrypt($b["shop_name"],$key)) > 13) { echo "..."; } ?></b> <?php } ?></div>
 
		<br/>
		<?php $stmt3 = $pdo->prepare("SELECT pvp, url, shop_id FROM products_shops WHERE product_id=".$i["id"]." ORDER BY pvp ASC LIMIT 3");
	$stmt3->execute();
	$i=1;
	while ($c = $stmt3->fetch(PDO::FETCH_ASSOC)) {
		$d = $pdo->prepare("SELECT shop_name FROM shops WHERE id=".$c["shop_id"]."");
	$d->execute();
		$d = $d->fetch(PDO::FETCH_ASSOC);
		?>
		<div class="prices" <?php if($i<3 && $totalRowCount>1){ echo "style=\"border-bottom:1px solid #eee\""; } ?>><a href="<?php echo $c["url"]; ?>" target="_blank" title="Ir a la oferta de <?php echo decrypt($d["shop_name"],$key); ?>" rel="nofollow"><span class="slc"><?php echo $i; ?>º</span><span class="nme"><?php echo substr(decrypt($d["shop_name"],$key), 0, 16); if(strlen(decrypt($d["shop_name"],$key)) > 16) { echo "..."; } ?></span> <div class="price bold"><?php echo $c["pvp"]; ?></div></a></div>
		<?php
		$i++;
	}
		?>
    </div>
  </div>
 
	<?php
	}
		?><?php for ($page = 1; $page <= $total_pages ; $page++):?>
        <a href='?page=<?php echo $page ?>' class="links">
            <?php  echo $page; ?>
	</a> |
	<?php endfor; ?>
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
Imágen de perfil de Ivan

Acortar páginación

Publicado por Ivan (118 intervenciones) el 14/09/2022 21:15:04
Hola,

tal vez no sea la manera más elegante de hacerlo, pero es efectivo y configurable.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
  $sidePages = 10;
  $total_pages = 25;
  if ($total_pages > ($sidePages * 2)) {
    for ($page=1; $page<$sidePages+1 ; $page++) {
      echo ' | <a class="links" href="?page='.$page.'">'.$page.'</a>';
    }
    echo ' | ... | ';
    for ($page=$total_pages-$sidePages+1; $page<=$total_pages; $page++) {
      echo '<a class="links" href="?page='.$page.'">'.$page.'</a> | ';
    }
  } else {
    for ($page=1; $page<=$total_pages; $page++) {
      echo ' | <a class="links" href="?page='.$page.'">'.$page.'</a>';
    }
    echo ' |';
  }
?>

En la variable $sidePages le dices el número de páginas que quieres por cada lado y automáticamente crea la paginación o muestra todas las páginas si el total es menor.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Acortar páginación

Publicado por Jordi (6 intervenciones) el 15/09/2022 13:56:47
Me sirvió muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar