2008-10-02 29 views
29

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.Algoritmo de paginación inteligente

Aquí está 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 lo que yo quiero terminar con:

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" (no trucating) ya está codificada, solo estoy buscando un ejemplo para optimizarlo ... Es c ser un ejemplo en cualquier idioma, siempre que me dé una idea de cómo implementarlo ...

+0

Ver mi pregunta sobre [enlaces de paginación] (http://stackoverflow.com/questions/44542/algorithm-pseudo-code-to-create-paging-links) – Geoff

+0

las preguntas sobre lo mismo debería mostrar el código lo has intentado, no se trata simplemente de una solicitud general de soluciones. Ver http://stackoverflow.com/about – Blazemonger

Respuesta

28

Hace un tiempo tuve la misma necesidad.

Aquí está el artículo que solía lograr que se haga (con código PHP): Digg-Style Pagination

funciona bastante rápido y tiene algunas adiciones a lo que estás tratando de hacer, como:

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

Es necesario limpiar el código, pero funciona muy bien. +1 –

+0

@changelog el sitio web del enlace está desactivado ... – tyan

+0

el algoritmo es incorrecto para la página 4, cuando los elementos por página 1,2, por ejemplo, muestra 1 2 ... 3 4 5 6 ... 20 –

0

me gustaría utilizar 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; 

se puede adaptar para mostrar cada uno 10 o más páginas con % operador ...

Creo que el uso de caja de conmutación() sería mejor en este caso, sólo que no recuerdo ahora la sintaxis

que sea sencillo :)

2

me hizo una clase de paginación y poner en Google Code hace un tiempo.Compruébelo usted mismo es bastante sencilla http://code.google.com/p/spaceshipcollaborative/wiki/PHPagination

$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(); 
2
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; 
15

un poco tarde =), pero aquí está mi ir en él:

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)); 

de 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)); 

de salida (@ Codepad):

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

funciona bien, excepto $ result = range (1, intval ($ data/$ limit)); en lugar de $ result = range (1, ceil ($ data/$ limit)); ceil está creando una página adicional –

+0

@JapanPro: ¿Y debería? Si tiene 99 resultados y quiere mostrar 10 por página, necesitará 'ceil (99/10) = 10' páginas. –

+2

@Alix Axel ¡Buena respuesta! pero una mejor implementación habría sido crear la matriz al final en lugar de cortar una existente ... (por ejemplo, qué pasa si tienes 12k páginas) – Aliceiw

0

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

La solución a su 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:'; 
       } 
     } 
}); 
0

El código de la CodeIgniter pagination -class puede se encuentra on GitHub

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

$config['num_links'] = 2; 

El número de enlaces "dígito" que le gustaría 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.

7

empecé desde el puesto de Lázaro y trataron de hacer un algoritmo robusto y ligero con Javascript/jQuery ... No hay bibliotecas de paginación adicionales y/o voluminosos necesarios ... mirada en el violín para 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> '); 
}