sencilla paginacion example bootstrap php pagination

php - paginacion - Algoritmo de paginación inteligente



php pagination class (8)

Estoy buscando un algoritmo de ejemplo de paginación inteligente. Por inteligente, lo que quiero decir es que solo quiero mostrar, por ejemplo, 2 páginas adyacentes a la página actual, así que en lugar de terminar con una lista de páginas ridículamente larga, la trunco.

Aquí hay un ejemplo rápido para hacerlo más claro ... esto es lo que tengo ahora:

Pages: 1 2 3 4 [5] 6 7 8 9 10 11

Esto es con lo que quiero terminar:

Pages: ... 3 4 [5] 6 7 ...

(En este ejemplo, solo estoy mostrando 2 páginas adyacentes a la página actual)

Lo estoy implementando en PHP / Mysql, y la paginación "básica" (sin trucaje) ya está codificada, solo estoy buscando un ejemplo para optimizarla ... Puede ser un ejemplo en cualquier idioma, siempre y cuando me da una idea de cómo implementarlo ...


El código de la clase de paginación CodeIgniter se puede encontrar en GitHub

(lo que usted llama) Paginación inteligente se puede lograr mediante la configuración.

$config[''num_links''] = 2;

La cantidad de enlaces de "dígitos" que desea antes y después del número de página seleccionado. Por ejemplo, el número 2 colocará dos dígitos en cada lado, como en los enlaces de ejemplo en la parte superior de esta página.


Empecé desde la publicación de Lázaro e intenté crear un algoritmo robusto y liviano con javascript / jquery ... No se necesitan bibliotecas de paginación adicionales y / o voluminosas ... Miren el violín para ver un ejemplo en vivo: http://jsfiddle.net/97JtZ/1/

var totalPages = 50, buttons = 5; var currentPage = lowerLimit = upperLimit = Math.min(9, totalPages); //Search boundaries for (var b = 1; b < buttons && b < totalPages;) { if (lowerLimit > 1 ) { lowerLimit--; b++; } if (b < buttons && upperLimit < totalPages) { upperLimit++; b++; } } //Do output to a html element for (var i = lowerLimit; i <= upperLimit; i++) { if (i == currentPage) $(''#pager'').append(''<li>'' + i + ''</li> ''); else $(''#pager'').append(''<a href="#"><li><em>'' + i + ''</em></li></a> ''); }


Hice una clase de paginación y lo puse en Google Code hace un tiempo. Verifíquelo es bastante simple

$paging = new Pagination(); $paging->set(''urlscheme'',''class.pagination.php?page=%page%''); $paging->set(''perpage'',10); $paging->set(''page'',15); $paging->set(''total'',3000); $paging->set(''nexttext'',''Next Page''); $paging->set(''prevtext'',''Previous Page''); $paging->set(''focusedclass'',''selected''); $paging->set(''delimiter'',''''); $paging->set(''numlinks'',9); $paging->display();


Si es posible generar la paginación en el cliente, sugeriría mi nuevo complemento de paginación: http://www.xarg.org/2011/09/jquery-pagination-revised/

La solución a tu pregunta sería:

$("#pagination").paging(1000, { // Your number of elements format: ''. - nncnn - '', // Format to get Pages: ... 3 4 [5] 6 7 ... onSelect: function (page) { // add code which gets executed when user selects a page }, onFormat: function (type) { switch (type) { case ''block'': // n and c return ''<a>'' + this.value + ''</a>''; case ''fill'': // - return ''...''; case ''leap'': // . return ''Pages:''; } } });


Tuve la misma necesidad hace un tiempo.

Aquí está el artículo que usé para hacerlo (con código PHP): Digg-Style Pagination

Funciona bastante rápido y tiene algunas adiciones a lo que intenta hacer, como:

[1] 2 3 4 5 6 ... 100 1 [2] 3 4 5 6 ... 100 ... 1 ... 4 5 [6] 7 8 ... 100


Un poco tarde =), pero aquí está mi intento:

function Pagination($data, $limit = null, $current = null, $adjacents = null) { $result = array(); if (isset($data, $limit) === true) { $result = range(1, ceil($data / $limit)); if (isset($current, $adjacents) === true) { if (($adjacents = floor($adjacents / 2) * 2 + 1) >= 1) { $result = array_slice($result, max(0, min(count($result) - $adjacents, intval($current) - ceil($adjacents / 2))), $adjacents); } } } return $result; }

Ejemplo:

$total = 1024; $per_page = 10; $current_page = 2; $adjacent_links = 4; print_r(Pagination($total, $per_page, $current_page, $adjacent_links));

Salida ( @ Codepad ):

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

Otro ejemplo:

$total = 1024; $per_page = 10; $current_page = 42; $adjacent_links = 4; print_r(Pagination($total, $per_page, $current_page, $adjacent_links));

Salida ( @ Codepad ):

Array ( [0] => 40 [1] => 41 [2] => 42 [3] => 43 [4] => 44 )


Usaría algo simple en la página que está mostrando el paginador, como:

if ( $page_number == 1 || $page_number == $last_page || $page_number == $actual_page || $page_number == $actual_page+1 || $page_number == $actual_page+2 || $page_number == $actual_page-1 || $page_number == $actual_page-2 ) echo $page_number;

Puede adaptarlo para mostrar cada 10 páginas aproximadamente con % operador ...

Creo que usar el caso switch () sería mejor en este caso, simplemente no recuerdo la sintaxis ahora

Mantenlo simple :)


List<int> pages = new List<int>(); int pn = 2; //example of actual pagenumber int total = 8; for(int i = pn - 9; i <= pn + 9; i++) { if(i < 1) continue; if(i > total) break; pages.Add(i); } return pages;