2008-10-02 6 views
29

Je cherche un exemple d'algorithme de pagination intelligente. Par smart, ce que je veux dire c'est que je veux juste montrer, par exemple, 2 pages adjacentes à la page en cours, donc au lieu de finir avec une liste de pages ridiculement longue, je la tronque.Algorithme de pagination intelligent

Voici un exemple rapide pour le rendre plus clair ... c'est ce que j'ai maintenant:

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

C'est ce que je veux terminer par:

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

(Dans cet exemple, , Je montre seulement 2 pages adjacentes à la page actuelle)

Je l'implémente en PHP/Mysql, et la pagination "basique" (pas de trucage) est déjà codée, je cherche juste un exemple pour l'optimiser ... c un être un exemple dans n'importe quelle langue, tant que cela me donne une idée quant à la façon de l'implémenter ...

+0

Voir ma question sur [liens de pagination] (http://stackoverflow.com/questions/44542/algorithm-pseudo-code-to-create-paging-links) – Geoff

+0

questions sur SO devrait afficher le code vous avez essayé, ne soyez pas simplement une demande générale de solutions. Voir http://stackoverflow.com/about – Blazemonger

Répondre

28

J'avais le même besoin il y a un moment.

Voici l'article que je les utilise pour le faire (avec le code PHP): Digg-Style Pagination

Il fonctionne très rapide et a quelques ajouts à ce que vous essayez de faire, comme:

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

Un nettoyage du code est nécessaire mais fonctionne très bien. +1 –

+0

@changelog le site de lien est en panne ... – tyan

+0

l'algorithme est faux pour la page 4, quand les articles par page 1,2 par exemple, il montre 1 2 ... 3 4 5 6 ... 20 –

0

j'utiliser quelque chose de simple sur la page que vous montrez paginateur, comme:

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; 

vous pouvez l'adapter à montrer chaque 10 ou de pages avec 012 opérateur...

Je pense que l'aide du commutateur() cas serait mieux dans ce cas, je ne me rappelle pas la syntaxe maintenant

Keep it simple :)

2

J'ai fait une classe pagination et mis sur Google Code il y a un certain temps.Check it son assez simple 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

Kinda fin =), mais voici mon aller à elle:

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

Exemple:

$total = 1024; 
$per_page = 10; 
$current_page = 2; 
$adjacent_links = 4; 

print_r(Pagination($total, $per_page, $current_page, $adjacent_links)); 

sortie (@ Codepad):

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

Un autre exemple:

$total = 1024; 
$per_page = 10; 
$current_page = 42; 
$adjacent_links = 4; 

print_r(Pagination($total, $per_page, $current_page, $adjacent_links)); 

sortie (@ Codepad):

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

ses travaux tout bien sauf $ result = range (1, intval ($ data/$ limite)); au lieu de $ result = range (1, ceil ($ data/$ limite)); ceil crée une page supplémentaire –

+0

@JapanPro: Et ça devrait? Si vous avez 99 résultats et que vous voulez afficher 10 par page, vous aurez besoin des pages 'ceil (99/10) = 10'. –

+2

@Alix Axel Bonne réponse !! mais une meilleure implémentation aurait été de créer le tableau à la fin au lieu de découper un tableau préexistant ... (par exemple si vous avez 12k pages) – Aliceiw

0

S'il est possible de générer la mise en page sur le client, je suggère mon nouveau plugin Pagination: http://www.xarg.org/2011/09/jquery-pagination-revised/

La solution à votre question serait:

$("#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

Le code de la CodeIgniter pagination -class peut être trouvé on GitHub

(ce que vous appelez) La pagination intelligente peut être obtenue par configuration.

$config['num_links'] = 2; 

Le nombre de liens « chiffres » que vous souhaitez avant et après le numéro de la page. Par exemple, le numéro 2 placera deux chiffres de chaque côté, comme dans les exemples de liens en haut de cette page.

7

Je suis parti de poste du Lázaro et a essayé de faire un algorithme robuste et léger avec javascript/jquery ... Aucune bibliothèque de paginations supplémentaires et/ou encombrants nécessaires ... Regardez le violon pour un exemple en direct: 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> '); 
}