2011-06-15 4 views
2

Je suis un débutant en php en particulier en faisant la pagination.paginer comme stackoverflow

ma question est, comment faire pagination comme la pagination de stackoverflow?
je veux dire la pagination comme ceci:

1 ... 5 6 8 9 ... 25
(le premier numéro et le dernier numéro est toujours apparaître, mais au milieu seulement 5 numéros avec la page sélectionnée absolument au milieu)

en php j'ai essayé de faire la pagination,

<?php 

//Show page links 
for($i=1; $i<=$pages; $i++) 
{ 
    echo '<li id="'.$i.'">'.$i.'</li>'; 
} 

?> 

b ut il sera montré toutes les pages comme

1 2 3 4 5 6 7 8 9 10 etc

tout corps ont par exemple logique simple pour résoudre ce problème?
merci beaucoup :)

Répondre

10

Ci-dessous un extrait d'un general pagination class je l'ai écrit il y a quelques années. Je l'ai édité pour montrer les parties appropriées seulement.

// cntAround is the number of pages to show before and after the current 
function renderNavigation($cntAround = 1) { 
    $out  = ''; 
    $isGap = false; // A "gap" is the pages to skip 
    $current = // Current page 
    $cntPages = // Total number of pages 

    for ($i = 0; $i < $pages; $i++) { // Run through pages 
     $isGap = false; 

     // Are we at a gap? 
     if ($cntAround >= 0 && $i > 0 && $i < $cntPages - 1 && abs($i - $current) > $cntAround) { // If beyond "cntAround" and not first or last. 
      $isGap = true; 

      // Skip to next linked item (or last if we've already run past the current page) 
      $i = ($i < $current ? $current - $cntAround : $cntPages - 1) - 1; 
     } 

     $lnk = ($isGap ? '...' : ($i + 1)); // If gap, write ellipsis, else page number 
     if ($i != $current && !$isGap) { // Do not link gaps and current 
      $lnk = '<a href="?page=' . ($i + 1) . '">' . $lnk . '</a>'; 
     } 
     $out .= "\t<li>" . $lnk . "</li>\n"; // Wrap in list items 
    } 

    return "<ul>\n" . $out . '</ul>'; // Wrap in list 
} 

Exemple 1

cntAround = 1, current = 5, cntPages = 9:

[1] ... [4] 5 [6] ... [9] 

Exemple 2

cntAround = 3, current = 5, cntPages = 11:

[1] [2] [3] [4] 5 [6] [7] [8] ... [11] 

1) article est en danois. Google Traduction version is here.

+0

Où les pages $ sont-elles inutilisées? –

+1

@ dap.tci Oups typo: -S A dû être '$ cntPages'. – jensgram

2

Un peu comme ce (pseudo-code):

pg = CurrentPageNo 
low = 1 
high = MAX_PAGES 
if (pg-low <=5) 
    output 1 to pg-1 [with links] 
else 
    output 1..3 [with links] 
    output "..." 
    output (pg-3) to (pg-1) [with links] 

output pg 

if (high - pg <=5) 
    output pg+1 to high [with links] 
else 
    output (pg+1) to high-3 [with links] 
    output "..." 
    output (high-2) to high [with links] 
1

Vous pouvez utiliser Zend_Paginator pour le faire, et d'apprendre à utiliser le Zend Framework pendant que vous y êtes.

12

Cela générera les nombres comme ci-dessus avec courant = 7, pages = 25. Remplacer les nombres avec des liens pour obtenir un index de pagination réel.

$current = 7; 
$pages = 25; 
$links = array(); 

if ($pages > 3) { 
    // this specifies the range of pages we want to show in the middle 
    $min = max($current - 2, 2); 
    $max = min($current + 2, $pages-1); 

    // we always show the first page 
    $links[] = "1"; 

    // we're more than one space away from the beginning, so we need a separator 
    if ($min > 2) { 
     $links[] = "..."; 
    } 

    // generate the middle numbers 
    for ($i=$min; $i<$max+1; $i++) { 
     $links[] = "$i"; 
    } 

    // we're more than one space away from the end, so we need a separator 
    if ($max < $pages-1) { 
     $links[] = "..."; 
    } 
    // we always show the last page 
    $links[] = "$pages"; 
} else { 
    // we must special-case three or less, because the above logic won't work 
    $links = array("1", "2", "3"); 
} 
echo implode(" ", $links); 

Sortie:

1 ... 5 6 7 8 9 ... 25 
+0

Merci. Cela m'aide et économise mon temps aussi. upvote pour toi chéri. – SHAZ