PHP

Навигация

Сегодня я Вам расскажу как написать постраничную навигацию как для mysql, так и для файлов.
Она же используется в этом блоге.

1. Начнем с определения нужных нам элементов.
В первую очередь для построения постраничной навигации, нужно знать общее количество элементов, которые будут отображены, количество элементов, отображаемых на странице и номер текущей страницы.
#PHP
<?php
$num=15; // количество элементов на страницу
if(isset($_REQUEST['page'])){ // проверяем, если переменная page передана скрипту, то заносим в переменную $page номер текущей страницы
$page=intval($_REQUEST['page']);
}else{ // иначе, даем ей значение 1
$page=1;
}

С этим мы определились. Теперь нам нужно посчитать общее кол-во элементов.
#PHP
<?php
// Для mysql это выглядит так:
$all=mysql_result(mysql_query('SELECT COUNT(*) FROM table'),0);
// Для файлов это выглядит так:
$file=file('123.txt'); // читаем файл построчно и сохраняем в переменной(она нам понадобится)
$all=sizeof($file); // считаем кол-во элементов

Дальше нам нужно просчитать, сколько всего страниц у нас будет, входит ли в эти пределы переменная $page и расчитать лимит показа на страницу
#PHP
<?php
$total=intval(($all-1)/$num)+1; // считаем кол-во страниц
if($page>$total){$page=$total;}elseif($page<1){$page=1;} // проверяем, чтобы $page не больше $total и не меньше 1
$start=$page*$num-$num; // рассчитываем лимит

Теперь нам нужно вывести элементы на страницу в соответствии с лимитом
#PHP
<?php
// для mysql
if($all){ // проверяем, есть ли вообще элементы
$res=mysql_query('SELECT * FROM table ORDER BY id DESC LIMIT '.$start.', '.$num); // вытаскиваем записи в соответствии с лимитом

while($m=mysql_fetch_assoc($res)){ // получаем массив и выводим в цикле
// вывод. например echo $m['id'];
}

page($all,'file.php?',$page,$total,'элементов'); // эту функцию мы разберем ниже
}else{
echo 'Нечего выводить';
}

#PHP
<?php
// для файлов
if($all){ // проверяем, есть ли вообще элементы

for($i=$start;$i<$start+$num;$i++){ // выводим записи от $start до $start+$num
if($page==$total and !isset($file[$i])){break;} // на последней странице проверяем существование индекса массива. Если не существует, то обрываем цикл через break. Это понадобится, т.к. $file[$i] на последней странице может и не существовать
// тут вывод. например echo $file[$i];
}

page($all,'file.php?',$page,$total,'элементов'); // эту функцию мы разберем ниже
}else{
echo 'Нечего выводить';
}

Все просто легко и осталось совсем немного - создать функцию page()
#PHP
<?php
function page($all,$hvost,$page,$total,$who){ // создаем функцию page().
/*
1 аргумент - общее кол-во элементов
2 - хвост, который будет прикреплен к ссылке(он не должен быть пустым, минимум имя файла и знак вопроса!)
3 - текущий номер страницы
4 - общее кол-во странц
5 - собственно имя того, чего выводим
*/
$hvost.='&'; // добавляем в конец хвоста ссылки амперсанд
echo '<div style="text-align: center;">Всего '.$who.': '.$all.'</div>'; // печатает что выводим сколько "этого" у нас
#######
if($page!=1){ // если текущая страница не первая, то выводим ссылку на предыдущую страницу
echo '<a href="'.$hvost.'page='.($page-1).'"><<Пред.</a> ';
if($page!=$total){echo '|| ';} // если страница не последняя, то печатаем разделитель
}


if($page<$total){ // если текущая страница меньше общего кол-ва страниц, то выводим ссылку на следющую страницу
echo ' <a href="'.$hvost.'page='.($page+1).'">След.>></a>';
}

echo '<br/>';
#######
$pp=$p2l=$p1l=$p1r=$p2r=$np=''; // создаем пустые переменные для последующего занесение в них навигации

if($page<$total){ // если текущая страница меньше общего кол-ва страниц, то заносим в переменную ссылку на следующую страну в виде цифры. Дальше расчеты комментировать считаю нет смысла, одна арифметика
$p1r='<a href="'.$hvost.'page='.($page+1).'">'.($page+1).'</a>';
if($page+1!=$total and $total-4<$page){$p1r.=',';}
}

if($page+4<$total){
$p1r.=',<a href="'.$hvost.'page='.($page+2).'">'.($page+2).'</a>';
}

if($page-3>0){
$pp='<a href="'.$hvost.'page=1">1</a>';

if($page-4>0){
$pp.=',<a href="'.$hvost.'page=2">2</a>';
}
if($page-5>0){
$pp.=',<a href="'.$hvost.'page=3">3</a>';
}
if($page-6>0 and $page<8){
$pp.=',<a href="'.$hvost.'page=4">4</a>';
}
if($page>7){$pp.='...';}else{$pp.=',';}

}

if($page+2<$total){
$np='<a href="'.$hvost.'page='.$total.'">'.$total.'</a>';
}

if($page-2>0){
$p2l='<a href="'.$hvost.'page='.($page-2).'">'.($page-2).'</a>,';
}

if($page-1>0){
$p1l='<a href="'.$hvost.'page='.($page-1).'">'.($page-1).'</a>,';
}


if($total-3>$page){

if($page+3==$total-3){
$p2r=',<a href="'.$hvost.'page='.($total-3).'">'.($total-3).'</a>';
}

if($page+2<$total-4){$p2r.='...';}else{$p2r.=',';}
$p2r.='<a href="'.$hvost.'page='.($total-2).'">'.($total-2).'</a>,<a href="'.$hvost.'page='.($total-1).'">'.($total-1).'</a>,';

}elseif($page+1<$total){

$p2r='<a href="'.$hvost.'page='.($page+2).'">'.($page+2).'</a>';
if($page+2<$total){$p2r.=',';}

}
#######
if($total!=1){ // если общее количество страниц не равно одному, то печатаем навигацию
echo $pp.$p2l.$p1l.' <b>'.$page.'</b> '.$p1r.$p2r.$np;
}
if($total>10){ // если общее количество страниц больше 10, то печатаем форму для ручного ввода номера страницы
echo '<form action="'.$hvost.'" method="post">
<input type="text" name="page" size="3" maxlength="3" value="'.$page.'" /><br/>
<input class="s" type="submit" value="Go!" />
</form>';
}

}

Итак, что мы проделали? Рассчитали что нам нужно показывать на странице и создали постраничную навигаию.
В итоге для mysql она выглядит так:
#PHP
<?php
if(isset($_REQUEST['page'])){ // проверяем, если переменная page передана скрипту, то заносим в переменную $page номер текущей страницы
$page=intval($_REQUEST['page']);
}else{ // иначе, даем ей значение 1
$page=1;
}
$num=15; // количество элементов на страницу
$all=mysql_result(mysql_query('SELECT COUNT(*) FROM table'),0); // считаем общее кол-во элементов
$total=intval(($all-1)/$num)+1; // считаем кол-во страниц
if($page>$total){$page=$total;}elseif($page<1){$page=1;} // проверяем, чтобы $page не больше $total и не меньше 1
$start=$page*$num-$num; // рассчитываем лимит

if($all){ // проверяем, есть ли вообще элементы
$res=mysql_query('SELECT * FROM table ORDER BY id DESC LIMIT '.$start.', '.$num); // вытаскиваем записи в соответствии с лимитом

while($m=mysql_fetch_assoc($res)){ // получаем массив и выводим в цикле
// вывод. например echo $m['id'];
}

page($all,'file.php?',$page,$total,'элементов'); // печатаем навигацию
}else{
echo 'Нечего выводить';
}

Для файлов выглядит так:
#PHP
<?php
if(isset($_REQUEST['page'])){ // проверяем, если переменная page передана скрипту, то заносим в переменную $page номер текущей страницы
$page=intval($_REQUEST['page']);
}else{ // иначе, даем ей значение 1
$page=1;
}
$num=15; // количество элементов на страницу
$file=file('123.txt'); // читаем файл построчно и сохраняем в переменной(она нам понадобится)
$all=sizeof($file); // считаем кол-во элементов
if($page>$total){$page=$total;}elseif($page<1){$page=1;} // проверяем, чтобы $page не больше $total и не меньше 1
$start=$page*$num-$num; // расчитываем лимит

if($all){ // проверяем, есть ли вообще элементы

for($i=$start;$i<$start+$num;$i++){ // выводим записи от $start до $start+$num
if($page==$total and !isset($file[$i])){break;} // на последней странице проверяем существование индекса массива. Если не существует, то обрываем цикл через break. Это понадобится, т.к. $file[$i] на последней странице может и не существовать
// тут вывод. например echo $file[$i];
}

page($all,'file.php?',$page,$total,'элементов'); // печатаем навигацию
}else{
echo 'Нечего выводить';
}

Функция page() для обоих навигаций одинакова!

На этом пока и закончим. Как видно, в этом нет ничего сложного!
Добавлено: 20 Августа 2013 01:28:17 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...