2010-06-14 1 views
10

Ich habe eine Paginierung Skript, das eine Liste aller Seiten, wie so zeigt:
prev [1][2][3][4][5][6][7][8][9][10][11][12][13][14] next
Aber ich möchte nur zu einem Zeitpunkt, zehn der Zahlen zeigen:
prev [3][4][5][6][7][8][9][10][11][12] nextPaginierung - 10 Seiten pro Seite

Wie kann ich das erreichen? Hier ist mein Code so weit:

<?php 
/* Set current, prev and next page */ 
$page = (!isset($_GET['page']))? 1 : $_GET['page']; 
$prev = ($page - 1); 
$next = ($page + 1); 

/* Max results per page */ 
$max_results = 2; 

/* Calculate the offset */ 
$from = (($page * $max_results) - $max_results); 

/* Query the db for total results. 
    You need to edit the sql to fit your needs */ 
$result = mysql_query("select title from topics"); 

$total_results = mysql_num_rows($result); 

$total_pages = ceil($total_results/$max_results); 

$pagination = ''; 

/* Create a PREV link if there is one */ 
if($page > 1) 
{ 
    $pagination .= '< a href="?page='.$prev.'">Previous</a> '; 
} 

/* Loop through the total pages */ 
for($i = 1; $i <= $total_pages; $i++) 
{ 
    if(($page) == $i) 
    { 
     $pagination .= $i; 
    } 
    else 
    { 
     $pagination .= '< a href="index.php?page='.$i.'">'.$i.'</a>'; 
    } 
} 

/* Print NEXT link if there is one */ 
if($page < $total_pages) 
{ 
    $pagination .= '< a hr_ef="?page='.$next.'"> Next</a>'; 
} 

/* Now we have our pagination links in a variable($pagination) ready to 
    print to the page. I pu it in a variable because you may want to 
    show them at the top and bottom of the page */ 

/* Below is how you query the db for ONLY the results for the current page */ 
$result=mysql_query("select * from topics LIMIT $from, $max_results "); 

while ($i = mysql_fetch_array($result)) 
{ 
    echo $i['title'].'<br />'; 
} 
echo $pagination; 
?> 
+1

Wir möchten, Fragen beantworten, nicht Ihre Arbeit für Sie tun. –

+0

Wie beabsichtigen Sie, die Seite automatisch zu verschieben, nachdem 10 Datensätze angezeigt wurden. Du brauchst JS dafür, dass du weißt – Starx

+2

Warum ist deine href mit einem "_" zwischen – Starx

Antwort

25

10 nächste Seiten

for($i = $page + 1; $i <= min($page + 11, $total_pages); $i++) 

oder wenn Sie wollen 5 zurück und 5 weiter

for($i = max(1, $page - 5); $i <= min($page + 5, $total_pages); $i++) 
+0

Dank für Ihre schnelle Antwort, Es war wirklich hilfreich .. habe nie gedacht, dass es so schnell gehen würde! :) – arthur

+0

ahh .. wusste nicht über das, was zu akzeptieren. nur letzte Frage .. Wie man das macht die ganze Zeit gibt es eine konstante Anzahl von Seiten (Zahlen) angezeigt. - Wenn ich öffne, zeigt es die Seiten 1-6 an, jedes Mal, wenn ich als nächstes drücke, fügt es 1 extra hinzu - 1-7; 1-8; 1-9; und schließen bis zum Ende es eins nach dem anderen entfernt ... – arthur

+1

@arthur: Verwenden Sie zweite für, es funktioniert wie ein 1-10, wenn Sie auf Seite 5 sind, und wenn Sie auf Weiter klicken, gehen Sie auf Seite 6 und haben 2- 11, auf Seite 7 hast du 3-12. Und Sie können die Frage annehmen, indem Sie auf die Markierung unter der Abstimmungsnummer auf der linken Seite meines Beitrags klicken. – Svisstack

0

Wenn Sie nur eine schnelle Lösung wollen, können Sie versuchen, Ihre for Schleife ein wenig zu verändern. Zum Beispiel wollen Sie nicht bei 1 beginnen, und Sie wollen nicht unbedingt Schleife während $i <= $total_pages.

Das Anzeigen einer ungeraden Anzahl von Paginierungslinks könnte mehr Sinn ergeben: Sie würden die aktuelle Seite anzeigen, dann vier davon links und vier nach rechts. Etwas wie folgt aus:

for($i = $page_number - 4; $i <= $page_number + 4; $i++) { 

aber Sie wäre natürlich ein wenig mehr tun, müssen Sie nicht die Anzeige negative Zahlen zu gewährleisten, wurden oder mehr Links anzuzeigen, als es Seiten.

+0

Diese Lösung ist ein Buggy, funktioniert nicht, wenn Sie auf Seite 4 oder weniger sind, und nicht richtig funktionieren, wenn Sie auf letzten 4 Seiten sind – Svisstack

+0

daher der letzte Absatz - Ich habe nur einen Ausgangspunkt –

0
$page = 3; 
$totalPages = 33; 
$count = 9; 
$startPage = max(1, $page - $count); 
$endPage = min($totalPages, $page + $count); 

if($page-1 > 0){ 
    echo '<a class="btn btn-default" href="/search-results?page="'.($page- 
1).'"><< Prev</a>'; 
} 

for($i = $startPage; $i < $endPage; $i++): if($i <= $totalPages): 

    echo '<a class="btn btn-<?=$i == $page || $i == 1 && $page == "" ? 
    'success' : 'primary';?>"style="margin-right:2px;" href="/search- 
    results?page="'.$i.'">'.$i.'</a>'; 

endif; endfor; 
if($page < $totalPages){ 
    echo '<a class="btn btn-default" href="/search-results?page="'. 
    ($page+1).'">Next >></a>'; 
} 
0

Ich habe gerade für eine Antwort auf die selbe Frage suchen, und couldn Ich finde es nicht, also habe ich es mir ausgedacht. Ich hoffe, dass jemand anderes es nützlich findet.

$totalPages = 20; 
$currentPage = 1; 

if ($totalPages <= 10) { 
    $start = 1; 
    $end = $totalPages; 
} else { 
    $start = max(1, ($currentPage - 4)); 
    $end = min($totalPages, ($currentPage + 5)); 

    if ($start === 1) { 
     $end = 10; 
    } elseif ($end === $totalPages) { 
     $start = ($totalPages - 9); 
    } 
} 

for ($page = $start; $page <= $end; $page++) { 
    echo '[' . $page . ']'; 
} 

Ergebnisse:

$currentPage = 1; // [1][2][3][4][5][6][7][8][9][10] 
$currentPage = 4; // [1][2][3][4][5][6][7][8][9][10] 
$currentPage = 10; // [6][7][8][9][10][11][12][13][14][15] 
$currentPage = 17; // [11][12][13][14][15][16][17][18][19][20] 
$currentPage = 20; // [11][12][13][14][15][16][17][18][19][20]