سؤال

لذلك أنا أفعل هذا في PHP ولكن هذا هو منطق المسألة لذا سأحاول أن أكتب على أنها بشكل عام ممكن.

لبدء هنا كيف هذا ترقيم الصفحات النصي يعمل:

  1. ل (رسم أول ثلاث صفحات الروابط)
  2. إذا (رسم علامة القطع (...) إذا كان هناك بين صفحات #1 صفحات #3 صفحات)
  3. ل (رسم الصفحة الحالية و صفحتين على كل جانب من الروابط)
  4. إذا (رسم elipsis (...) إذا كان هناك بين صفحات #3 صفحات و #5 صفحات)
  5. ل (رسم النهائي ثلاث صفحات الروابط)

المشكلة هي أنه عندما تكون هناك كميات قليلة من الصفحات (لاحظت هذا عندما الصفحة العد 10) يجب أن يكون هناك القطع ولكن لم يتم استخلاصها.

على كود:

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

لذا أعتقد أن أفضل فكرة أن يكون تعديل واحد من اثنين من القطع إذا كانت البيانات تشمل مثل هذه الحالة ، ومع ذلك لقد حاولت وأنا الحيرة.

يرجى أيضا ملاحظة أنه لا المكثف هذا الرمز من أجل قراءة أجل لذلك من فضلك لا تعطي نصائح مثل "تلك الحلقات غير فعالة لأنها سوف حساب current_page - 2 لكل التكرار" لأنني أعرف :)


بالنسبة لأولئك الذين يرغبون في رؤية انهيار كيف هذا المنطق يعمل حاليا هنا هو مثال الإخراج ( معدلة ) مع بالتكرار $page_count دولار current_page.http://rafb.net/p/TNa56h71.html

هل كانت مفيدة؟

المحلول

<?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] 

نصائح أخرى

وربما هذا هو الحل المعقد كثيرا ، لكنه يعمل.

لقد استعملت مجموعة هنا بدلا من مجرد الطباعة ، الذي يتيح لي "على" منطق.

جزء من المشكلة تحدث عندما "اليسار واليمين من صفحة" يتزامن مع اليسار واليمين الكتفين.

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;

}

الناتج يمكن أن ينظر إليه هنا: http://dpaste.com/92648/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top