2017-04-06 1 views
0

아래의이 페이지 매김 스크립트를 사용하고 있습니다. 문제는 그것이 페이지의 연속적인 카운트를 제공한다는 것입니다. 예를 들어, 10 페이지가있는 경우 숫자 1 2 3 4 5 6 7 8 9 10 (해당 페이지를 모두 클릭 할 수 있음)을 알려줍니다. 내가 원하는 것은 5 이후 페이지 매김 횟수를 줄이는 것입니다. 1 2 3 4 5.......9 10이 표시되어야합니다. 그런 다음 페이지 번호 5를 클릭하면 1을 감추고 6을 2 3 4 5 6....9 10으로 표시해야합니다. 도와주세요. 난 당신이 설명하는지 생각하지 않는다페이지 매기기 (pagination) 페이지 번호 계산하기

$start = 0; 
$limit = 1; 

if(isset($_GET['id'])){ 
    $id = (!empty($_GET['id']))?$_GET['id']:null; 
    $start = ($id-1)*$limit; 
}else{ 
    $id = null; 
} 

$stmt = $pdo->prepare("SELECT ad_id, ad_description, ad_url, ad_memclicks, ad_visclicks, ad_status, avc_clicks FROM ads 
         LEFT JOIN ads_viewed_cost ON ads.ad_clicks = ads_viewed_cost.avc_id 
         WHERE ad_user = :user LIMIT $start, $limit"); 
$stmt-> bindValue(':user', $sessionid); 
$stmt-> execute(); 

$count = $pdo->prepare("SELECT COUNT(*) as cnt FROM ads LEFT JOIN ads_viewed_cost ON ads.ad_clicks = ads_viewed_cost.avc_id WHERE ad_user = :user"); 
$count-> bindValue(':user', $sessionid); 
$count-> execute(); 
$rf = $count->fetch(); 
$rows = $rf['cnt']; 
$total = ceil($rows/$limit); 

if($id>1){ 
    echo "<span class='pre'><a href='?id=".($id-1)."' class='button'>PREVIOUS</a></span>"; 
} 
if($id!=$total){ 
    echo "<span class='next'><a href='?id=".($id+1)."' class='button'>NEXT</a></span>"; 
} 

echo "<ul class='pagination'>"; 
for($i=1; $i<=$total; $i++){ 
    if($i == $id){ 
    echo "<li class='current'>".$i."</li>"; 
    }else{ 
    echo "<li><a href='?id=".$i."'>".$i."</a></li>"; 
    } 
} 
echo "</ul>"; 

답변

1

당신이 가서 당신이 첫 번째 페이지를 잃고으로 페이지 매김을 할 수있는 가장 좋은 방법입니다, 그러나 이것은 당신이 무엇을 요구한다.

$dots = false; 
for ($i=1; $i<=$total; $i++) { 
    if($i == $id) { 
     echo "<li class='current'>{$i}</li>"; 
    } else { 
     if (($id < 5 && $i < 5) || (($i > $id-4 && $i < $id) || $i > $total-2 || $i == $id+1)) { 
      echo "<li><a href='?id=".$i."'>{$i}</a></li>"; 
     } else { 
      if ($i > $id && !$dots) { 
       echo "..."; 
       $dots = true; 
      } 
     } 
    } 
} 

현재 $id이 5보다 작 으면 첫 번째 페이지가 표시됩니다. 그 다음에는 현재 페이지 세 개 앞에 그 다음 페이지가 표시됩니다 (id = 5 일 때 2, 3, 4, 5, 6이 표시됨).

현재 페이지 + 1과 마지막 두 페이지 사이에 간격이 있지만 점은 한 번만 표시됩니다 (부울이 사용하는 것임).

마지막 두 페이지가 항상 표시됩니다.

큰 페이지 세트 (최대 100)로 테스트하여 예상대로 작동합니다. 당신이 극단적 인 외부 일단


매김을 할 수있는 일반적인 방법에 StackOverflow 자체가 그것을처럼 될 것입니다, 당신은 첫 번째 페이지, 도트, 현재 페이지와 몇 가지 측면 중 하나, 점, 마지막 보여 페이지.

1 ... 12 13 [14] 15 16 ... 100 내가 여기 당신을 위해 제공 한 것과 첫 페이지 앵커없이

, 그것은 클릭이 많이 걸릴 수있다 큰 페이지가 설정된 페이지 1로 돌아 가기.

이 방법을 사용하려면이 코드를 대신 사용할 수 있습니다. 변경 사항은 if 논리에 있고 두 번째 부울은 두 점 집합을 모두 처리합니다. 내 실수에 대한

$dotsLow = false; 
$dotsHi = false; 
for ($i=1; $i<=$total; $i++) { 
    if($i == $id) { 
     echo "<li class='current'>{$i}</li>"; 
    } else { 
     if (
      ($i == 1 || $i == $total) || 
      ($id < 5 && $i < 5) || 
      ($id > $total-4 && $i > $total-4) || 
      ($i >= $id-2 && $i <= $id+2) 
     ) { 
      echo "<li><a href='?id=".$i."'>{$i}</a></li>"; 
     } else { 
      if ($i > $id && !$dotsHi) { 
       echo "..."; 
       $dotsHi = true; 
      } 
      if ($i < $id && !$dotsLow) { 
       echo "..."; 
       $dotsLow = true; 
      } 
     } 
    } 
} 
+0

좋아 죄송합니다 .. 당신은 .. 나는 두 번째 방법 가고 오른쪽하려는 ..하지만 난 내와 코드를 교체 할 때, 세 개의 점은 당신으로 마지막 숫자 뒤에 만오고되지 않습니다 위의 예제에서'1 ... 12 13 [14] 15 16 ... 100'을 받았습니다. 내가 얻는 점만 올바른 위치에 있지 않습니다. 코드가 작동 중입니다. –

+0

어떤 페이지에서 '$ id'? 두 도트 세트는 10 페이지 세트의 5 페이지와 6 페이지에만 나타납니다. – domwrap

+0

아니요 ... 당신이 언급하는 곳은 나타나지 않습니다 .. 마지막 번호 뒤에 나와있는 페이지가 어떤지 상관없이 나타납니다.하지만 솔루션에 감사드립니다. 점을 제외하고는 나머지를 원해 ... 감사합니다 :) –