Smart Paginierung Algorithmus [geschlossen]
-
03-07-2019 - |
Frage
Ich suche nach einem Beispiel Algorithmus von Smart Paginierung. Durch die intelligente, was ich meine ist, dass ich nur zum Beispiel zeigen wollen, 2 benachbarten Seiten der aktuellen Seite, so statt endet mit einer lächerlich langen Seite Liste, ich gestutzt es.
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
Das ist das, was ich mit am Ende will:
Pages: ... 3 4 [5] 6 7 ...
(In diesem Beispiel zeige ich nur zwei benachbarten Seiten der aktuellen Seite)
Ich bin die Umsetzung in PHP / MySQL, und die „basic“ Paginierung (kein trucating) ist bereits codiert, ich bin nur ein Beispiel, es zu optimieren ... Es kann ein Beispiel in jeder Sprache sein, solange es mir eine Idee gibt, wie es zu implementieren ...
Lösung
Ich hatte müssen das gleiche vor einer Weile.
Hier ist der Artikel, den ich verwenden, um es (mit PHP-Code) zu erledigen: Digg-Style Paginierung
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
Hier ist der Code aus dem defekten Link:
<?php
/*
Place code to connect to your DB here.
*/
// How many adjacent pages should be shown on each side?
$adjacents = 3;
/*
First get total number of rows in data table.
If you have a WHERE clause in your query, make sure you mirror it here.
*/
$query = "SELECT COUNT(*) as num FROM portfolio";
$total_pages = mysql_fetch_array(mysql_query($query));
$total_pages = $total_pages[num];
/* Setup vars for query. */
$limit = 2; //how many items to show per page
if($page)
$start = ($page - 1) * $limit; //first item to display on this page
else
$start = 0; //if no page var is given, set start to 0
/* Get data. */
$query = "SELECT category, uname, title FROM portfolio LIMIT $start, $limit";
$portfolio = mysql_query($query);
/* Setup page vars for display. */
if ($page == 0) $page = 1; //if no page var is given, default to 1.
$prev = $page - 1; //previous page is page - 1
$next = $page + 1; //next page is page + 1
$lastpage = ceil($total_pages/$limit); //lastpage is = total pages / items per page, rounded up.
$lpm1 = $lastpage - 1; //last page minus 1
/*
Now we apply our rules and draw the pagination object.
We're actually saving the code to a variable in case we want to draw it more than once.
*/
$pagination = "";
if($lastpage > 1)
{
$pagination .= "<div class="\"pagination\"">";
//previous button
if ($page > 1)
$pagination.= "<a href="\"diggstyle.php?page=$prev\"">« previous</a>";
else
$pagination.= "<span class="\"disabled\"">« previous</span>";
//pages
if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
{
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "<span class="\"current\"">$counter</span>";
else
$pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";
}
}
elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some
{
//close to beginning; only hide later pages
if($page < 1 + ($adjacents * 2))
{
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
{
if ($counter == $page)
$pagination.= "<span class="\"current\"">$counter</span>";
else
$pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";
}
$pagination.= "...";
$pagination.= "<a href="\"diggstyle.php?page=$lpm1\"">$lpm1</a>";
$pagination.= "<a href="\"diggstyle.php?page=$lastpage\"">$lastpage</a>";
}
//in middle; hide some front and some back
elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
{
$pagination.= "<a href="\"diggstyle.php?page=1\"">1</a>";
$pagination.= "<a href="\"diggstyle.php?page=2\"">2</a>";
$pagination.= "...";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
{
if ($counter == $page)
$pagination.= "<span class="\"current\"">$counter</span>";
else
$pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";
}
$pagination.= "...";
$pagination.= "<a href="\"diggstyle.php?page=$lpm1\"">$lpm1</a>";
$pagination.= "<a href="\"diggstyle.php?page=$lastpage\"">$lastpage</a>";
}
//close to end; only hide early pages
else
{
$pagination.= "<a href="\"diggstyle.php?page=1\"">1</a>";
$pagination.= "<a href="\"diggstyle.php?page=2\"">2</a>";
$pagination.= "...";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "<span class="\"current\"">$counter</span>";
else
$pagination.= "<a href="\"diggstyle.php?page=$counter\"">$counter</a>";
}
}
}
//next button
if ($page < $counter - 1)
$pagination.= "<a href="\"diggstyle.php?page=$next\"">next »</a>";
else
$pagination.= "<span class="\"disabled\"">next »</span>";
$pagination.= "</div>\n";
}
?>
<ul>
<?php
while($item = mysql_fetch_array($portfolio))
{
?>
<li><a href="/web/20080709045706/http://www.strangerstudios.com/portfolio//"></a></li>
<?php
}
?>
</ul>
<?=$pagination?>
Andere Tipps
Kinda spät =), aber hier ist mein geht an ihn:
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 weiteres 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
)
Ich begann aus dem Lazaros Post und versuchte, einen robusten und leichten Algorithmus mit Javascript / jquery zu machen ... Keine zusätzlichen und / oder sperrige Paginierung Bibliotheken benötigt ... Schauen Sie 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> ');
}
Ich habe eine Paginierung Klasse und setzen in auf Google Code vor einer Weile. Überprüfen Sie es heraus seine 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();
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;
ich etwas einfach auf der Webseite würde 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 mit %
Bediener zeigen ...
Ich denke, mit Schalter () Fall in diesem Fall besser wäre, ich die Syntax einfach nicht erinnern jetzt
Keep it Simple:)
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 für Ihre 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:';
}
}
});
Der Code des CodeIgniter Paginierung -Klasse können auf GitHub
(wie Sie es nennen) Smart-Paginierung kann durch Konfiguration erreicht werden.
$config['num_links'] = 2;
Die Zahl der „digit“ Links möchten Sie vor und nach dem ausgewählte Seitennummer. Zum Beispiel finden die Nummer 2 zwei Ziffern auf beiden Seiten verbindet, wie im Beispiel ganz am Anfang der Seite.