New question

Question:

Date: 23-03-2016 10:48:02 (In Spanish)

Limitar barra de paginación numérica[Unresolved]

Hola amigos,
Hoy vengo a ver quien me puede ayudar con esto.
Tengo un páginador de registros con filtro por letra.
Pero quiero que me muestre un limite del contador.
Explico el me muestra los registros y todo bien pero en la paginación los numeros si tengo muchos resultados se alarga demasiado.
Ejm:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 Etc

Quiero que me muestre un maximo de 9:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Y si llegamos al 9 me muestra el resto.

9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17

Y así sucesivamente espero que me puedan ayudar adjunto Código:
<?
	include "includes/config.php";
	
	//Limito la busqueda
	$TAMANO_PAGINA = 10;

	//examino la página a mostrar y el inicio del registro a mostrar
	$pagina = $_GET["pagina"];
	if (!$pagina) {
		$inicio = 0;
		$pagina=1;
	}
	else {
		$inicio = ($pagina - 1) * $TAMANO_PAGINA;
	}

	//inicializo el criterio y recibo cualquier cadena que se desee buscar
	$criterio = "";
	if ($_GET["criterio"]!=""){
		$txt_criterio = $_GET["criterio"];
		$criterio = " where nombre like '%" . $txt_criterio . "%'";
	}

	//miro a ver el número total de campos que hay en la tabla con esa búsqueda
	$ssql = "select * from prueba " . $criterio;
	$rs = mysqli_query($con, $ssql);
	$num_total_registros = mysqli_num_rows($rs);
	//calculo el total de páginas
	$total_paginas = ceil($num_total_registros / $TAMANO_PAGINA);

	//pongo el número de registros total, el tamaño de página y la página que se muestra
	echo "Número de registros encontrados: " . $num_total_registros . "<br>";
	echo "Se muestran páginas de " . $TAMANO_PAGINA . " registros cada una<br>";
	echo "Mostrando la página " . $pagina . " de " . $total_paginas . "<p>";

	//construyo la sentencia SQL
	$ssql = "select * from prueba " . $criterio . " limit " . $inicio . "," . $TAMANO_PAGINA;
	$rs = mysqli_query($con, $ssql);
	while ($fila = mysqli_fetch_object($rs)){
		echo $fila->nombre . "<br>";
	}
	//cerramos el conjunto de resultado y la conexión con la base de datos
	mysqli_free_result($rs);
	mysqli_close($con);

	//muestro los distintos índices de las páginas, si es que hay varias páginas
	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 $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='paginador.php?pagina=" . $i . "&criterio=" . $txt_criterio . "'>" . $i . "</a> ";
		}
	}
?>


Saludos
Equipo AnimeSensei
Tags: Development - HTML - MySQL - Pagination - PHP - Question Votes: 2 - Answers: 6 - Views: 18 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 24-03-2016 06:12:06 Hola Edinson, basado en el estilo de programación (que no es de mi gusto, pero funciona para proyectos chicos) lo que tienes que hacer es configurar una constante que sea el valor máximo de páginas a mostrar.

    Por ejemplo:
    define('PAGINADOR_MAX_PAG', 9);


    Luego podrás contrastar tu variable $total_paginas con dicha constante, y mostrar X números hacia atras y X números hacia delante.

    Observa como funciona la paginación de las preguntas en la comunidad, "siempre que se pueda" el link de la página que estas visualizando queda en el medio, y digo "siempre que se pueda" porque cuando se selecciona la página 2 (por ejemplo) el link nunca podrá esta en medio, lo mismo sucederá al final.

    Espero que mi respuesta te sea de ayuda, no es código pero si los lineamientos con los cuales podrás dar con la solución.

    Saludos,
      Votes: 2 - Link answer
     
  • Date: 25-03-2016 11:54:37 Hola Fernando,

    Logre solucionarlo así pero la cosa es que el numero siempre queda en la mitad y si es la primera página solo me muestra 3 hacia abajo y si es la ultima pasa lo mismo pero hacia arriba.

    <?
    	$paginate_max = 3;
    	//muestro los distintos índices de las páginas, si es que hay varias páginas
    	if ($total_paginas > 1){
    		$pmin = ($pagina>$paginate_max) ? ($pagina-$paginate_max) : 1;
    		$pmax = ($pagina<($total_paginas-$paginate_max)) ? ($pagina+$paginate_max) : $total_paginas;
    		for($i=$pmin; $i<=$pmax; $i++) {
    			if ($pagina == $i){
    				//si muestro el índice de la página actual, no coloco enlace
    				echo "<li class='active'><a>".$pagina."</a><li>";
    			}else{
    				if($_GET["criterio"]!=""){
    					//si el índice no corresponde con la página mostrada actualmente, coloco el enlace para ir a esa página
    					echo "<li><a href='".$url."/animes/letra/" . $txt_criterio . "/" . $i . "/'>" . $i . "</a></li>";
    				}else{
    					echo "<li><a href='".$url."/animes/" . $i . "/'>" . $i . "</a></li>";
    				}
    			}
    		}
    	}
    ?>
    


    No se como pudiera solucionarlo.

    Saludos
    Equipo AnimeSensei
      Votes: 0 - Link answer
     
  • Date: 26-03-2016 03:27:48 Buen día, no respondo directamente a tu problema pero pregunto, no utilizás librerías jquery? Si es así, existe una librería datatable que te soluciona todos estos problemas. No se hace mucho han liberado una versión que se basa en la filosofía bootstrap.

    Saludos
      Votes: 1 - Link answer
     
  • Date: 26-03-2016 13:26:45 Hola amigo,
    Si uso la libreria JQuery pero no como ese medio de paginación si no como medio de animación a eso se lo dejo a lo que es el PHP.

    Saludos
    Equipo Anime Sensei
      Votes: 0 - Link answer
     
  • Date: 28-03-2016 09:12:40 La lógica seria lo siguiente:

    1. calcular el total de entradas (ej: 100)
    2. definir la cantidad de entrada por paginas (ej. 6)
    3. dividir el total de entradas por las paginas (100/6 = 16.6 que serian 17 en este caso)
    4. definir la cantidad de paginas visibles (ejemplo: 5)

    5. si la cantidad de paginas visibles es del limiteinferior al limitesuperior (0 a 4) mostrar las paginas
    del limite inferior al limitesuperior + 1

    6. si la pagina actual es igual o mayor al limite superior, cambiar el limiteinferior al limitesuperior anterior y el nuevo limite superior es igual al limitesuperor mas la cantidad de paginas visibles (5 al 10)


    Falta definir el limite inferior, si es que estan en la segunda serie de paginacion.. pero bueno dinos si ya tienes del paso 1 al paso 6
      Votes: 2 - Link answer
     
  • Date: 28-03-2016 11:06:48 Hola amigo,

    Gracias por responder.
    Siéndote sincero no tengo ni idea relativa de cómo hacer bn eso, si pudieras ayudarme un poco con código de ejemplo con cada paso te lo agradecería nunca fui muy bueno entendiendo problemas yo entiendo más fácil con ejemplos y así los mejoro aveces.

    Saludos.
    PD: en la parte de arriba creo que me aproximé un poco pero me dio ese error. XD
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In