2013-07-11 4 views
0

В настоящее время у меня есть действующий скрипт разбиения на страницы, хотя я не хватает функции. На данный момент сотни страниц могут отображаться в списке $ pages, потому что нет фильтра для отображения между, например, [1] [...] 5, 6, 7 [..] [45] , Вот мой код:PHP разбиение на страницы с количеством страниц

/** Pagination **/ 
    $limit = 7; 
    $query = "SELECT COUNT(*) FROM users"; 
    $result = $db->prepare($query); 
    $result->execute(); 
    $pages_query = $result->fetchColumn(0); 
     $count = number_format($pages_query); 
     $pages = ceil($pages_query/$limit); 
    $page = (isset($_GET['page'])) ? (int)$_GET['page'] : 1; 
    $start = ($page - 1) * $limit; 
    ob_start(); 
     echo("<span class='alignright'>"); 
     if ($pages >= 1 && $page <= $pages){ 
      if($page > 1){ 
       $next = ($page - 1); 
       $link = "?page=$next"; 
       echo("<a class='paginate' href='$link'><i class='icon-caret-left'></i></a>"); 
      } 
     for ($x=1; $x<=$pages; $x++){ 
      echo ($x == $page) ? "<strong style='font-weight: bold!important;'><a class='paginate' href='?page=$x'>$x</a></strong>" : "<a class='paginate' href='?page=$x'>$x</a>"; 
     } 
     if($page < $pages){ 
      $next = ($page + 1); 
      $link = "?page=$next"; 
      echo("<a class='paginate' href='$link'><i class='icon-caret-right'></i></a>"); 
     } 
     echo("</span>"); 
     if($count > 0){ 
      echo("<span class='smalltext'>Page <strong class='half'>$page</strong> of $pages:</span>"); 
     } else { 
      echo("<span class='smalltext'>There are <span class='half'>$count</span> results to display.</span>"); 
     } 
    $pagintion = ob_get_clean(); 

(Это был лишен от другого мусора, который был в нем, но это вообще кадр.) В основном я пытаюсь выяснить, как ограничить его иметь «между страницами» вниз нижней как указано в верхней части вопроса. Что-то вроде: [<] [1] ... [4] [5] [6] ... [45] [>] Если это имеет смысл.

ответ

0

вы можете попробовать LIMIT с в запросе сам

SELECT * FROM table_name LIMIT STARTING_RESULT_NUMBER, RESULTS_PER_PAGE

RESULTS_PER_PAGE является No.of элементов на странице вы хотите отобразить STARTING_RESULT_NUMBER = (CURRENT_PAGE_NUMBER * RESULTS_PER_PAGE)

+0

У него уже есть предел, он хочет отображать нумерацию таким образом ** [<] [1] ... [4] [5] [6] ... [45] [>] * * – machineaddict

0

Чтобы изменить список страниц на что-то вроде [<] [1] ... [4] [5] [6] ... [45] [>], вместо того чтобы показывать все номера страниц, вы можете заменить петлю for на что-то вроде:

echo "<a class='paginate' href='?page=1'>1</a>"; 
if($page > 3) {echo "...";} 
if($page > 2) {echo "<a class='paginate' href='?page=" . $x-1 . "'>" . $x-1 "</a>";} 
if($page != 1 && $page != pages) {echo "<a class='paginate' href='?page=" . $x . "'>" . $x "</a>";} 
if($page < $pages-1) {echo "<a class='paginate' href='?page=" . $x+1 . "'>" . $x+1 "</a>";} 
if($page < $pages-2) {echo "...";} 
if($pages >1) {echo "<a class='paginate' href='?page=1'>1</a>";} 

Ил покажет первую страницу, последние страницы, текущие страницы и те, которые были непосредственно перед и после.

+0

Я пробовал это, но он, похоже, не работал. Он не показывал страниц между ними, только первый и последний, к сожалению. –

0

Мое личное значение с разбиением на страницы состоит в том, что оно должно быть легко читаемым и простым в дальнейшем. я напечатал следующий код, основанный на что ты, например:

$totalPages = 145; //the total amount of pages 
$selectedPage = 40; //the selected page 

$pages = array(); //the array which is gonna hold the pages we need to display 
$offset = 3; //the number of pages to select around the selected page 

$closePages = range($selectedPage - $offset, $selectedPage + $offset); //select the pages that are in $offset of the selected page 

array_filter($closePages, function($x) { //filter the pages below 1 and above $totalPages 
    return ($x <= $totalPages && $x >= 1 ? true : false); 
}); 

array_push($pages, 1); //add the first page 
array_push($pages, '...'); //add some dots 

$pages = array_merge($pages, $closePages); 

array_push($pages, '...'); //and again add some dots 
array_push($pages, $totalPages); //add the last page 

Затем вы используете цикл Еогеасп для отображения страниц:

foreach($pages as $page) { 
    if (is_numeric($page)) { 

     if ($page != $selectedPage) $content .= ' <a href="?page=' . $page . '">' . $page . '</a> '; 
     else $content .= ' <a href="?page=' . $page . '"><strong>' . $page . '</strong></a> '; 

    } else 
     $content .= '[...]'; 
} 

Некоторые объяснения после того как вы прокомментировать этот ответ:

В переменной $ totalPages должно быть общее количество страниц на странице (из примера), а $ selectedPage - это страница, выбранная в данный момент.

$totalPages = ceil($pages_query/$limit); 
$selectedPage = isset($_GET['page']) ? $_GET['page'] : 1; 
+0

Я смущен, как это реализовать. Я предполагаю, что мои $ totalPages будут равны $ page, а $ selectedPage будет равно $ page, так? Я попытался реализовать код, и ничего не появилось для страниц. –

+0

@ JordanLovelle, я добавил несколько объяснений ниже ответа. Если вы не получите никакого результата, попробуйте заполнить некоторые случайные числа, чтобы проверить его. – Benz

Смежные вопросы