Простой PHP Paginator


В своей жизни я видел несколько подобных скриптов, но с вами решил поделиться тем, который использую в своих проектах. Если вы начинающий разработчик, то рано или поздно, вы столкнётесь с тем, что вам необходимо будет распределять информацию по страницам. Для этого нам понадобится язык PHP и база данных с информацией. Наверняка вы видели примеры подобного функционала. Его можно встретить на любом крупном сайте. Код Для того чтобы начать, нам надо создать подключение к базе данных. Далее мы определим несколько переменных. ‘$tableName’ будет содержать имя таблицы, в которой хранится информация, которую мы будем распределять по разным страницам. Она будет содержать список стран - ‘countries_list’, ‘$targetpage’, ‘$limit’ это количество строк, которые должны отображаться на странице. В нашем случае мы будет выводить по 10 записей. А теперь я приведу список того, что делает следующий код. Определяет три основные переменные, имя таблицы откуда будут извлекаться данные, название документа и количество отображаемых строк; Далее мы подключаемся к базе и считаем количество строк, для того, чтобы знать с каким объёмом информации нам предстоит работать; Если номер страницы передан нам как GET параметр то мы проверяем номер. Если он не валидный отправляем пользователя на первую страницу; Затем нам необходимо сделать выборку; Далее мы определяем номера для следующей и предыдущей страницы, а так же для первой и последней; Теперь у нас есть целый ряд выражений, которые вычисляют все необходимые данные. Общее число страниц и т.д. В конце мы выводим значение переменной ‘$paginate’ для отображения номеров страниц Затем в цикле выводим записи 001 <?php 002 include('connect.php'); 003 004 $tableName="countries_list"; 005 $targetpage = "index.php"; 006 $limit = 10; 007 008 $query = "SELECT COUNT(*) as num FROM $tableName"; 009 $total_pages = mysql_fetch_array(mysql_query($query)); 010 $total_pages = $total_pages[num]; 011 012 $stages = 3; 013 $page = mysql_escape_string($_GET['page']); 014 if($page){ 015 $start = ($page - 1) * $limit; 016 }else{ 017 $start = 0; 018 } 019 020 $query1 = "SELECT * FROM $tableName LIMIT $start, $limit"; 021 $result = mysql_query($query1); 022 023 if ($page == 0){$page = 1;} 024 $prev = $page - 1; 025 $next = $page + 1; 026 $lastpage = ceil($total_pages/$limit); 027 $LastPagem1 = $lastpage - 1; 028 029 $paginate = ''; 030 if($lastpage > 1) 031 { 032 033 $paginate .= "<div class='paginate'>"; 034 if ($page > 1){ 035 $paginate.= "<a href='$targetpage?page=$prev'>previous</a>"; 036 }else{ 037 $paginate.= "<span class='disabled'>previous</span>"; } 038 039 if ($lastpage < 7 + ($stages * 2)) 040 { 041 for ($counter = 1; $counter <= $lastpage; $counter++) 042 { 043 if ($counter == $page){ 044 $paginate.= "<span class='current'>$counter</span>"; 045 }else{ 046 $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";} 047 } 048 } 049 elseif($lastpage > 5 + ($stages * 2)) 050 { 051 if($page < 1 + ($stages * 2)) 052 { 053 for ($counter = 1; $counter < 4 + ($stages * 2); $counter++) 054 { 055 if ($counter == $page){ 056 $paginate.= "<span class='current'>$counter</span>"; 057 }else{ 058 $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";} 059 } 060 $paginate.= "..."; 061 $paginate.= "<a href='$targetpage?page=$LastPagem1'>$LastPagem1</a>"; 062 $paginate.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>"; 063 } 064 elseif($lastpage - ($stages * 2) > $page && $page > ($stages * 2)) 065 { 066 $paginate.= "<a href='$targetpage?page=1'>1</a>"; 067 $paginate.= "<a href='$targetpage?page=2'>2</a>"; 068 $paginate.= "..."; 069 for ($counter = $page - $stages; $counter <= $page + $stages; $counter++) 070 { 071 if ($counter == $page){ 072 $paginate.= "<span class='current'>$counter</span>"; 073 }else{ 074 $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";} 075 } 076 $paginate.= "..."; 077 $paginate.= "<a href='$targetpage?page=$LastPagem1'>$LastPagem1</a>"; 078 $paginate.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>"; 079 } 080 else 081 { 082 $paginate.= "<a href='$targetpage?page=1'>1</a>"; 083 $paginate.= "<a href='$targetpage?page=2'>2</a>"; 084 $paginate.= "..."; 085 for ($counter = $lastpage - (2 + ($stages * 2)); $counter <= $lastpage; $counter++) 086 { 087 if ($counter == $page){ 088 $paginate.= "<span class='current'>$counter</span>"; 089 }else{ 090 $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";} 091 } 092 } 093 } 094 095 if ($page < $counter - 1){ 096 $paginate.= "<a href='$targetpage?page=$next'>next</a>"; 097 }else{ 098 $paginate.= "<span class='disabled'>next</span>"; 099 } 100 101 $paginate.= "</div>"; 102 103 } 104 echo $total_pages.' Results'; 105 echo $paginate; 106 ?> 107 108 <ul> 109 110 <?php 111 112 while($row = mysql_fetch_array($result)) 113 { 114 115 echo '<li>'.$row['country'].'</li>'; 116 117 } 118 119 ?> 120 </ul> Добавим немного стиля Давайте теперь немного оформим наш paginator 01 .paginate { 02 font-family:Arial, Helvetica, sans-serif; 03 padding: 3px; 04 margin: 3px; 05 } 06 07 .paginate a { 08 padding:2px 5px 2px 5px; 09 margin:2px; 10 border:1px solid #999; 11 text-decoration:none; 12 color: #666; 13 } 14 .paginate a:hover, .paginate a:active { 15 border: 1px solid #999; 16 color: #000; 17 } 18 .paginate span.current { 19 margin: 2px; 20 padding: 2px 5px 2px 5px; 21 border: 1px solid #999; 22 23 font-weight: bold; 24 background-color: #999; 25 color: #FFF; 26 } 27 .paginate span.disabled { 28 padding:2px 5px 2px 5px; 29 margin:2px; 30 border:1px solid #eee; 31 color:#DDD; 32 } 33 34 li{ 35 padding:4px; 36 margin-bottom:3px; 37 background-color:#FCC; 38 list-style:none;} 39 40 ul{margin:6px; 41 padding:0px; 42 }