Frage

Also ich dies in PHP mache, aber es ist ein logisches Problem, damit ich werde versuchen, es zu schreiben, wie allgemein wie möglich.

Um hier zu starten, wie das Paginierung Skript funktioniert:

  1. für ( zeichnen ersten drei Seiten Links )
  2. if ( Auslassungszeichen (... ziehen), wenn es von Seiten zwischen # 1 Seiten und das # 3 Seiten )
  3. für ( zieht aktuelle Seite und zwei Seiten auf jeder Seite davon Links )
  4. if ( ziehen Elipsis (...), wenn es von Seiten zwischen 3s # Seiten und Seiten des # 5 )
  5. für ( zeichnen letzten drei Seiten Links )

Das Problem ist, dass, wenn es geringe Mengen an Seiten (ich dies bemerkt, wenn die Seitenzahl bei 10 war) soll es ein Auslassungszeichen, aber keine gezogen wird.

Auf den Code:

$page_count = 10; //in actual code this is set properly
$current_page = 1; //in actual code this is set properly

for ($i = 1;$i <= 3;$i++)
{
    if ($page_count >= $i)
        echo $i;
}

if ($page_count > 3 && $current_page >= 7)
    echo "...";

for ($i = $current_page - 2;$i <= current_page + 2;$i++)
{
    if ($i > 3 && $i < $page_count - 2)
        echo $i;
}

if ($page_count > 13 && $current_page < $page_count - 5)
    echo "...";

for ($i = $page_count - 2;$i <= $page_count;$i++)
{
    if ($page_count > 3)
        echo $i;
}

So denke, ich die beste Idee, zu modifizieren, eine der beiden Ellipsen sein würde, wenn Aussagen einen Fall wie diesem zu schließen, aber ich habe versucht und bin ratlos.

Bitte beachten Sie auch, dass ich diesen Code zur besseren Lesbarkeit halber kondensiert, so bitte geben Sie Tipps, wie „die für Schleifen unwirksam sind, weil sie current_page neu berechnet - 2 für jede Iteration“, weil ich weiß:)


Für diejenigen, die eine Aufschlüsselung sehen wollen, wie diese Logik zur Zeit arbeitet, ist hier beispielsweise Ausgang (modifiziert) mit Iterieren $ PAGE_COUNT und $ current_page. http://rafb.net/p/TNa56h71.html

War es hilfreich?

Lösung

<?php

/**
 * windowsize must be odd
 *
 * @param int $totalItems 
 * @param int $currentPage 
 * @param int $windowSize 
 * @param int $anchorSize 
 * @param int $itemsPerPage 
 * @return void
 */
function paginate($totalItems, $currentPage=1, $windowSize=3, $anchorSize=3, $itemsPerPage=10) {
    $halfWindowSize = ($windowSize-1)/2;

    $totalPages = ceil($totalItems / $itemsPerPage);
    $elipsesCount = 0;
    for ($page = 1; $page <= $totalPages; $page++) {
        // do we display a link for this page or not?
        if ( $page <= $anchorSize ||  
            $page > $totalPages - $anchorSize ||
            ($page >= $currentPage - $halfWindowSize &&
            $page <= $currentPage + $halfWindowSize) ||
            ($page == $anchorSize + 1 &&
             $page == $currentPage - $halfWindowSize - 1) ||
            ($page == $totalPages - $anchorSize &&  
             $page == $currentPage + $halfWindowSize + 1 ))
        {
            $elipsesCount = 0;
            if ($page == $currentPage)
                echo ">$page< ";
            else
                echo "[$page] ";
        // if not, have we already shown the elipses?
        } elseif ($elipsesCount == 0) {
            echo "... ";
            $elipsesCount+=1; // make sure we only show it once
        }
    }
    echo "\n";
}

//
// Examples and output
//

paginate(1000, 1, 3, 3);
// >1< [2] [3] ... [98] [99] [100] 

paginate(1000, 7, 3, 3);
// [1] [2] [3] ... [6] >7< [8] ... [98] [99] [100] 

paginate(1000, 4, 3, 3);
// [1] [2] [3] >4< [5] ... [98] [99] [100] 

paginate(1000, 32, 3, 3);
// [1] [2] [3] ... [31] >32< [33] ... [98] [99] [100] 

paginate(1000, 42, 7, 2);
// [1] [2] ... [39] [40] [41] >42< [43] [44] [45] ... [99] [100] 

Andere Tipps

Dies ist wahrscheinlich eine allzu komplizierte Lösung, aber es funktioniert.

Ich habe ein Array hier statt nur drucken, verwendet, die mich lässt „do-over“ der Logik.

Ein Teil des Problems tritt auf, wenn „links und rechts der Seite“ geschieht mit der linken und rechten Schultern zusammen.

function cdotinator ( $current_page, $page_count ) 
{
  $stepsize = 3; 
  $elipse = '...';
  # Simple Case. 
  if ( $page_count <= 2 * $stepsize )
  {
    $out = range( 1, $page_count );
    $out[$current_page - 1 ] = '*' . $current_page . '*';
    return $out;
  }
  #Complex Case
  # 1) Create All Pages
  $out = range( 1, $page_count ); 
  # 2 ) Replace "middle" pages with "." placeholder elements 
  for( $i = $stepsize+1 ; $i <= ( $page_count - $stepsize ) ; $i ++ )
  {
    $out[ $i - 1 ] = '.' ; 
  }
  # 3.1 ) Insert the pages around the current page 
  for( $i =  max(1,( $current_page - floor($stepsize / 2) )) ;
       $i <= min( $page_count,( $current_page + floor( $stepsize/2))); 
       $i ++ )
  {
    $out[ $i - 1] = $i;
  }
  # 3.2 Bold Current Item
  $out[ $current_page - 1 ] = '*' . $current_page . '*' ; 

  # 4 ) Grep out repeated '.' sequences and replace them with elipses 
  $out2 = array(); 
  foreach( $out as $i => $v )
  {
    #  end, current  == peek() 
    end($out2);
    if( current($out2) == $elipse and $v == '.' )
    {
        continue;
    }
    if( $v == '.' )
    {
      $out2[] = $elipse; 
      continue;
    }
    $out2[]= $v;
  }

  return $out2;

}

Ausgabe hier zu sehen ist: http://dpaste.com/92648/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top