it-swarm.com.de

Intelligenter Paginierungsalgorithmus

Ich suche nach einem Beispielalgorithmus der intelligenten Paginierung. Mit smart meine ich, dass ich zum Beispiel nur 2 nebeneinander liegende Seiten zur aktuellen Seite anzeigen möchte. Statt einer lächerlich langen Seitenliste zu beenden, schneide ich sie ab.

Hier ist ein kurzes Beispiel, um es klarer zu machen ... Folgendes habe ich jetzt:

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

Das ist es, was ich möchte mit:

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

(In diesem Beispiel werden nur 2 benachbarte Seiten zur aktuellen Seite angezeigt.)

Ich implementiere es in PHP/Mysql, und die "grundlegende" Paginierung (kein Trucating) ist bereits codiert. Ich suche nur nach einem Beispiel, um es zu optimieren ... Es kann ein Beispiel in jeder Sprache sein, solange Es gibt mir eine Idee, wie ich es umsetzen kann ...

29
jeannicolas

Ich hatte vor einer Weile das gleiche Bedürfnis.

Hier ist der Artikel, den ich dazu verwendet habe (mit PHP Code): 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
28
changelog

Ein bisschen spät =), aber hier ist mein Anlauf:

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

Ausgabe ( @ Codepad ):

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

Ein anderes Beispiel:

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

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

Ausgabe ( @ Codepad ):

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

Ich begann mit dem Beitrag des Lazaro und versuchte, einen robusten und leichten Algorithmus mit Javascript/Jquery zu erstellen ... Es sind keine zusätzlichen und/oder sperrigen Seitenbibliotheken erforderlich ... Schauen Sie auf der Geige nach einem Live 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> ');
}
7
Edwin
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;
2
lazaro

Ich habe vor einiger Zeit eine Paginierungsklasse erstellt und in Google Code aufgenommen. Überprüfen Sie es aus, es ist ziemlich einfach  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
Jacob

Ich würde etwas einfaches auf der Seite verwenden, auf der Sie den Paginator anzeigen, 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 so anpassen, dass alle 10 Seiten mit dem %-Operator angezeigt werden.

Ich denke die Verwendung von switch () wäre in diesem Fall besser, ich erinnere mich einfach nicht an die Syntax jetzt

Halte es einfach :)

0

Der Code der CodeIgniter-Paginierung - Klasse kann auf GitHub /gefunden werden

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

$config['num_links'] = 2;

Die Anzahl der "Ziffern" -Links, die Sie vor und nach der Gewählten Seitennummer wünschen. Zum Beispiel wird die Zahl 2 auf jeder Seite zwei Ziffern Einfügen, wie in den Beispiellinks oben auf dieser Seite.

0
Natrium

Wenn es möglich ist, die Paginierung auf dem Client zu generieren, würde ich mein neues Paginierungs-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
Robert Eisele