Постраничный вывод

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#1
Про LIMIT и т.п. рассказывать не буду, сами в курсе. Когда делаете постраничный вывод, очень помогает след ф-я.
PHP:
function LeftRight($records,$r_start,$URL,$inpage=20)
{
$str="";
if($records<=$inpage) return;
if($r_start!=0)
{
$str.="<a href=".$URL."0>«</a>";
$str.="<a href=$URL".($r_start-1).">‹</a>";
}else $str.="«‹";
#Считаем количество страниц
if($records%$inpage==0) $add=0; else $add=1;
$page_count=(intval($records/$inpage)+$add);
#Ссылки на первые 10 страниц, начиная с первой
if($r_start<5)
{
$sstart=0;
$send=10;
}
#Ссылки на 10 страниц, влево и вправо по 5, относительно текущей
if($r_start>=5 and $r_start<=($page_count-5))
{
$sstart=$r_start-5;
$send=$r_start+5;
}
#Ссылки на последние 10 страниц
if($r_start>($page_count-5))
{
$sstart=$page_count-10;
$send=$page_count;
}
if($sstart<0) $sstart=0;
if($send*$inpage>$records) $send=$page_count;
$str.= ' | ';
#Выводим список ссылок
for($i=$sstart;$i<$send;$i++)
{
if($i==$r_start) $str.="<b>".($i+1)."</b>";
else $str.="<a href=$URL".($i)."><u><b>".($i+1)."</b></u></a>";
}
if($r_start+1<$page_count)
{
$str.="<a href=$URL".($r_start+1).">›</a>";
$str.="<a href=$URL".($page_count-1).">»</a>";
} else $str.="›»";
return($str);
}
Выводит красивую строчку со ссылками на страницы.
* $records - всего записей
* $r_start - текущая страница
* $URL - адрес, заканчивающийся на "="
* $inpage - записей на страницу
Сперто - http://www.codenet.ru/webmast/php/Navigation-Bar/
Отредактировано немного мной.
 

asmiheev

New Member
05.02.2009
1
0
30
Екатеринбург
#2
В свое время нашел хорошу функцию для тех же целей. Если страниц очень много, то она выводит не все номера, а только первый, последний, текущий и два вокруг текущего. Ну т.е. например так: 1 ... 49 50 51 ... 100
Сам немного подправлял в своих целях:

PHP:
 // Generate a string with numbered links
// Mark Daimon
function paginate($docs_cnt, $cur_page, $link_to)
{
$pages = array();
$link_to_all = false;

// If $cur_page == -1, we link to all pages (used in query)
if ($cur_page == -1)
{
$cur_page = 1;
$link_to_all = true;
}

if ($num_pages <= 1)
$pages = array('<b>1</b>');
else
{
if ($cur_page > 3)
{
$pages[] = '<a href="'.$link_to.'1">1</a>';

if ($cur_page != 4)
$pages[] = '…';
}

// Don't ask me how the following works. It just does, OK? :-)
for ($current = $cur_page - 2, $stop = $cur_page + 3; $current < $stop; ++$current)
{
if ($current < 1 || $current > $num_pages)
continue;
else if ($current != $cur_page || $link_to_all)
$pages[] = '<a href="'.$link_to.''.$current.'">'.$current.'</a>';
else
$pages[] = '<b>'.$current.'</b>';
}

if ($cur_page <= ($num_pages-3))
{
if ($cur_page != ($num_pages-3))
$pages[] = '…';

$pages[] = '<a href="'.$link_to.''.$num_pages.'">'.$num_pages.'</a>';
}
}

return implode(' ', $pages);
}
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#3
Помотрел вот ф-ю, вы видимо подправляли и кое-чего забыли. Откуда в ф-ии береться $num_pages?=) ПОдправьте.
 
T

typak

Гость
#5
ОТ НАШОЛ НИПЛОХУЮ ПЕРЕДЕЛАЛ ПОД СЕБЯ ПРОФИ КОД:
Код:
<?php /* //________ФУНКЦИЯ ПРИНИМАЕТ три ПАРАМЕТР НАЗВАНИЕ ТАБЛИЦЫ
И КОЛИЧЕСТВО СТАТЕЙ НА СТРАНИЦЕ(ПО УМОЛЧАНИЮ РАВНО 20) и адрес страницы___________/////// */?>
<?php function pages($table, $kol=20, $url){
//Переменная хранит число статей на странице.
$num =$kol;
$page = "";
//Извлекаем из url текущую стараницу
$page = $_GET['page'];
//Подсчет общего количества строк в таблице/(COUNT(*)) возвращает общее количество строк таблицы/
$result = mysql_query("SELECT COUNT(*) FROM `$table` ");
$posts = mysql_result($result, 0);/*Возвращает результат запроса выполненый функцией mysql_query
Переменная $posts присваивает значение количества строк в таблице в численном виде*/
//Находим общее число страниц.
$total = intval(($posts - 1) / $num) + 1;//+1 и -1 помогает неупустить страницу если нет кратности
//Определяем начало сообщений для текущей страницы
$page = intval($page);//intval преобразует к вещественному типу $page
/* Если значение $page меньше единици или отрицательно,
то переходим на первую страницу, если значение сильно большое,
то переходим на последнюю страницу */
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
/* Вичисляем с какого номера надо выводить сообщение */
$start = $page * $num - $num;
//Вибираем $num статей начиная с номера $start
$res = mysql_query("SELECT * FROM `$table`  LIMIT $start, $num ");/* делаем запрос выборки начиная со
значения $start строки со значением старт, в количестве переменной $num */
//return $res;
################################################################################
############
#__________________________________ВЫВОД НАВИГАЦИИ______________________#################
################################################################################
#############

//Задаем значение переменным равным NULL шоб невыводило замечание
$pervpage=$page2left=$pate1left=$page1right=$page2right=$nextpage=NULL;
//Проверяем нужны ли стрелки назад
if($page != 1) $pervpage = ' | <a href='.$url.'?page=1>первая</a> | 
<a href='.$url.'?page='.($page-1).'>назад</a>';
//Проверяем нужны ли стрелки вперед?
if($page != $total) $nextpage = ' | <a href='.$url.'?page='.($page+1).'>next</a> | 
<a href='.$url.'?page='.$total.'>последняя</a>';

//Находим две ближайшие страницы с общих краев если они есть
if($page - 2 > 0) $page2left = ' | <a href='.$url.'?page='.($page-2).'>'.($page-2).'</a> | ';
if($page - 1 > 0) $pate1left = ' | <a href='.$url.'?page='.($page-1).'>'.($page-1).'</a> | ';
if($page+2<=$total) $page2right = ' | <a href='.$url.'?page='.($page+2).'>'.($page+2).'</a>';
if($page+1<=$total) $page1right = ' | <a href='.$url.'?page='.($page+1).'>'.($page+1).'</a>';
//Вивод самой навигации.
echo $pervpage.$page2left.$pate1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
return $res;

}?>
ПОЛЬЗУЙТЕСЬ ОЧЕНЬ ХОРОШАЯ НАВИГАЦИЯ правда непроверял но в ней даже я разобрался НОВИЧОК.