Pagination Sorunu [PHP]

1 Cevap php

Yani PHP yapıyorum ama jenerik olarak mümkün olduğunca yazmaya çalışacağım bu yüzden bir mantık konudur.

Burada başlamak için bu Sayfalandırması komut nasıl çalışıyor:

  1. için (draw first three pages links)
  2. Eğer (draw ellipsis (...) if there are pages between #1's pages and #3's pages)
  3. için (draw current page and two pages on each side of it links)
  4. Eğer (draw elipsis (...) if there are pages between #3's pages and #5's pages)
  5. için (draw final three pages links)

Sorun sayfaların düşük miktarlarda (sayfa sayısı 10 oldu zaman farkettim) zaman orada bir üç nokta olmalı ama hiçbiri çizilmiş olmasıdır.

Kodu üstüne:

$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;
}

Yani iyi bir fikir böyle bir davayı dahil ifadeler, ancak ben denedim ve stumped eğer iki üç nokta birini değiştirmek için olmak olur rakam.

Ben biliyorum çünkü :) - Ayrıca ben "her yineleme için 2 onlar CURRENT_PAGE yeniden hesaplamak çünkü döngüler için olanlar etkisiz" so gibi ipuçlarını vermeyin lütfen okunabilirlik uğruna bu kodu yoğunlaşmış unutmayın


For those whom want to see a breakdown of how this logic currently works, here is example output ( modified ) with iterating $page_count and $current_page. http://rafb.net/p/TNa56h71.html

1 Cevap

Bu muhtemelen bir overcomplicated çözümdür, ama çalışıyor.

Bana izin yerine sadece baskı burada bir dizi kullandım "do-over" mantığı.

"Sol ve sayfanın sağ" sağ sol ve omuzları ile denk olur sorunun bir parçası oluşur.

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;

}

Çıktı buradan görülebilir: http://dpaste.com/92648/