2008-10-02 10 views
29

Ich bin auf der Suche nach einem Beispiel Algorithmus der intelligenten Paginierung. Mit Smart meine ich, dass ich zum Beispiel nur 2 nebeneinander liegende Seiten der aktuellen Seite zeigen möchte, damit ich nicht mit einer lächerlich langen Seitenliste enden muss, sondern sie abschneide.Smart Paginierung Algorithmus

Hier ist ein kurzes Beispiel es deutlicher zu machen ... das ist, was ich habe jetzt:

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

Dies ist, was ich mit will am Ende:

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

(In diesem Beispiel , Ich zeige nur 2 nebeneinanderliegende Seiten zur aktuellen Seite)

Ich implementiere es in PHP/Mysql, und die "grundlegende" Paginierung (no trucating) ist bereits codiert, ich bin nur auf der Suche nach einem Beispiel um es zu optimieren ... Es c ein Beispiel in jeder Sprache sein, solange es mir eine Idee gibt, wie man es implementiert ...

+0

Siehe meine Frage auf [Paging-Links] (http://stackoverflow.com/questions/44542/algorithm-pseudo-code-to-create-paging-links) – Geoff

+0

Fragen auf SO den Code zeigen sollte Sie haben versucht, nicht nur eine allgemeine Anfrage nach Lösungen. Siehe http://stackoverflow.com/about – Blazemonger

Antwort

28

Ich hatte die gleiche Notwendigkeit vor einer Weile.

Hier ist der Artikel, den ich es (mit PHP-Code) durchgeführt zu gewöhnen: Digg-Style Pagination

Es funktioniert ziemlich schnell und hat einige Ergänzungen zu dem, was Sie zu tun versuchen, wie:

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

Einige Reinigung des Codes ist notwendig, aber funktioniert gut. +1 –

+0

@changelog die Link-Website ist down ... – tyan

+0

der Algorithmus ist falsch für Seite 4, wenn Elemente pro Seite 1,2 zum Beispiel zeigt es 1 2 ... 3 4 5 6 ... 20 –

0

würde ich etwas einfach auf der Seite verwenden Sie den paginator zeigen, wie:

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; 

Sie können es anpassen alle 10 oder so Seiten zu zeigen, mit % Operator ...

Ich denke, mit dem Schalter() Fall würde in diesem Fall besser sein, ich erinnere mich nicht nur die Syntax jetzt

Keep it Simple :)

2

ich gemacht Paginierung Klasse und vor einiger Zeit in Google Code einfügen.Überprüfen Sie es heraus sein recht einfaches 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 spät =), aber hier ist mein gehen an ihm:

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

Beispiel:

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

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

Output (@ Codepad):

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

Ein weiteres Beispiel:

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

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

Output (@ Codepad):

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

funktioniert alles gut außer $ result = range (1, intval ($ data/$ limit)); statt $ result = range (1, ceil ($ data/$ limit)); ceil erstellt eine zusätzliche Seite –

+0

@JapanPro: Und es sollte? Wenn Sie 99 Ergebnisse haben und 10 pro Seite anzeigen möchten, benötigen Sie 'ceil (99/10) = 10' Seiten. –

+2

@Alix Axel Schöne Antwort !! aber eine bessere Implementierung hätte das Array am Ende erstellt, anstatt ein bereits vorhandenes zu schneiden .... (z. B. was ist, wenn Sie 12k Seiten haben) – Aliceiw

0

Wenn es möglich ist, die Paginierung auf dem Client zu erzeugen, würde ich mein neues Paginierung Plugin vorschlagen: http://www.xarg.org/2011/09/jquery-pagination-revised/

Die Lösung Ihrer Frage wäre:

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

Der Code des CodeIgniter pagination -Klasse können gefunden on GitHub

(was Sie anrufen) Smart Paginierung kann durch Konfiguration erreicht werden.

$config['num_links'] = 2; 

Die Zahl der „digit“ Links würden Sie vor und nach der gewählten Seitennummer mögen. Zum Beispiel wird die Zahl 2 zwei Ziffern auf beiden Seiten platzieren, wie in den Beispiel-Links ganz oben auf dieser Seite.

7

begann ich aus der Post lazaro und versuchte, einen robusten und leichten Algorithmus mit Javascript/jquery zu machen ... Keine zusätzlichen und/oder sperrigen Paginierung Bibliotheken benötigt ... Blick auf Geige für ein anschauliches Beispiel: 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> '); 
}