2009-03-03 5 views
2

< < 1 2 3 4 ... 15 16 17 ... 47 48 49 50 >>A Scaling Paginator

< 7 ... 47 48 49 50 >>

< < 1 2 3 4 ... 44 46 47 48 49 50 >>

(das Fett ist die ausgewählte Seite)

Gibt es irgendeine Cleaver-Logik, die Skalierungspaginierung wie diese erzeugt? Ich habe eines davon schon einmal erstellt, aber es endete als ein Chaos logischer Aussagen.

Die Sprache, in der ich das jetzt mache, ist PHP, aber wenn Sie Beispiele oder Tipps für irgendeine Sprache haben, würde es geschätzt werden.

Mit Skalierung meine ich, wenn es nur ein paar Seiten gibt. Die Paginierung zeigt dies an.

< 5 6 7 >>

Da die Anzahl der Seiten zu einem gewissen Punkt wachsen, hält die Paginierung alle Zahlen zeigt, und startet sie bis zu splitten.

< < 2 3 4 ... 47 48 49 50 >>

< 5 6 ... 47 48 49 50 >>

< 7 8 ... 47 48 49 50 >>

< < 1 2 3 4 .. 7 8 9 ... 47 48 49 50 >>

< < 1 2 3 4 .. 15 16 17 ... 47 48 49 50 >>

< < 1 2 3 4 ... 44 46 47 48 49 50 >>

< < 1 2 3 4 ... 47 48 49 50 >>

(beachten Sie, die tatsächlichen Zahlen und wie viele es zeigt vor und nach nicht relevant ist)

+0

Können Sie mehr erklären, was Sie mit "Skalierung" meinen? –

Antwort

2

Sorry für die Klecks-Code, aber hier geht. Hoffentlich sind die Kommentare genug, um Ihnen zu sagen, wie es funktioniert - wenn Sie einen Kommentar hinterlassen und ich könnte noch etwas hinzufügen.

/** 
    * Get a spread of pages, for when there are too many to list in a single <select> 
    * Adapted from phpMyAdmin common.lib.php PMA_pageselector function 
    * 
    * @param integer total number of items 
    * @param integer the current page 
    * @param integer the total number of pages 
    * @param integer the number of pages below which all pages should be listed 
    * @param integer the number of pages to show at the start 
    * @param integer the number of pages to show at the end 
    * @param integer how often to show pages, as a percentage 
    * @param integer the number to show around the current page 
    */ 
    protected function pages($rows, $pageNow = 1, $nbTotalPage = 1, $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20, $range = 10) 
    { 
     if ($nbTotalPage < $showAll) 
      return range(1, $nbTotalPage); 

     // Always show the first $sliceStart pages 
     $pages = range(1, $sliceStart); 

     // Always show last $sliceStart pages 
     for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++) 
      $pages[] = $i; 

     $i = $sliceStart; 
     $x = $nbTotalPage - $sliceEnd; 
     $met_boundary = false; 
     while ($i <= $x) 
     { 
      if ($i >= ($pageNow - $range) && $i <= ($pageNow + $range)) 
      { 
       // If our pageselector comes near the current page, we use 1 
       // counter increments 
       $i++; 
       $met_boundary = true; 
      } 
      else 
      { 
       // We add the percentate increment to our current page to 
       // hop to the next one in range 
       $i = $i + floor($nbTotalPage/$percent); 

       // Make sure that we do not cross our boundaries. 
       if ($i > ($pageNow - $range) && !$met_boundary) 
        $i = $pageNow - $range; 
      } 

      if ($i > 0 && $i <= $x) 
       $pages[] = $i; 
     } 

     // Since because of ellipsing of the current page some numbers may be double, 
     // we unify our array: 
     sort($pages); 
     return array_unique($pages); 
    } 
+0

Danke, ich bin nicht mit deinem Code genau gegangen, aber es hat mir geholfen zu lernen, wo ich meine verbessern kann. –