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

12
NS
На сайте с 20.12.2006
Offline
37
1015

Постраничный вывод С ОГРАНИЧЕНИЕМ

Есть такой код для постраничного вывода:


$p = 1;
do {
if ($page == $p)
{ echo "<a href=cat.php?id_categ=$id_categ&page=$p><b><font size=4>$p</font></b></a>\n";
}
else
{ echo "<a href=cat.php?id_categ=$id_categ&page=$p>$p</a>\n";
}
$p++;
}
while ($p <= $total);

где

// $page - это $_GET['page']

// $total - общее число записей в БД

Чтобы сделать постраничный вывод я делю общее количество записей в БД на желаемое количество записей

на одной странице и получаю число страниц. Далее с помощью формулы и LIMIT делаю постраничный вывод на страницы.

Всё это работает нормально.

Но скоро на сайте будет более 100 страниц, поэтому надо как-то ограничить число страниц на одной странице (сорри за тафтологию),

т.е. сначала выводятся 5 страниц, затем кликая на ">>" выводятся следующие 5 страниц и так далее,

пока не закончатся все страницы на сайте.

Как такое сделать?

Более наглядно это видно на скриншоте: http://mir44.ru/tmp/page.gif

кострома (http://mir44.ru) | санатории россии (http://www.kostroma-kurort.ru). Помню, давно размещался на этой доске бесплатных объявлений (http://www.add2.ru), а также на куче других сайтов с объявлениями
Agel Nash
На сайте с 01.12.2008
Offline
61
#1

Доработки вам как домашнее задание


$limit=5;
$p=$_GET['page']<1?1:$_GET['page'];
if($p>1) echo "<a href=pages.php?id_categ=$id_categ&page=".($p-1)."><<</a>\n";
for($i=-2;$i<($limit-2);$i++)
{
$page=$i+$p;
if($page>0)
echo ($page==$p)?"<a href=pages.php?id_categ=$id_categ&page=".$page."><b><font size=4>".$page."</font></b></a>\n":echo "<a href=pages.php?id_categ=$id_categ&page=".$page.">".$page."</a>\n";
}
echo "<a href=pages.php?id_categ=$id_categ&page=".($p+1).">>></a>\n";
Я (http://agel-nash.ru) - вильгельм "ЗАКОЛЕБАТЕЛЬ" Аудит безопасности MODX сайтов (/ru/forum/783778) | Обучение созданию сайтов (http://modcoach.info/)
Апокалипсис
На сайте с 02.11.2008
Offline
391
#2
Записки нищего (http://zapiskinishego.ru) - мой личный блог Услуги php программиста. Очень нужна любая работа. Не покупают? Поведенческий аудит интернет-магазина за 5000 руб. (/ru/forum/990312)
T
На сайте с 13.01.2009
Offline
50
#3
NS
На сайте с 20.12.2006
Offline
37
#4

на pyha.ru хорошо написано, но там:

"пагинаторе мы не будем выводить все страницы от 1 .. до 150 например, а будем выводить только соседние по отношению к текущей,

например если у нас выбрана страница 5, то мы введем слева и справа от неё определённое кол-во страниц, допустим у нас это кол-во будет равно 6."

а тут надо, чтобы постраничная навигация выводились "партиями" по 5 страниц

T
На сайте с 13.01.2009
Offline
50
#5

Ну так поменяй числа , в чём проблемма ?

Agel Nash
На сайте с 01.12.2008
Offline
61
#6
not_something:
а тут надо, чтобы постраничная навигация выводились "партиями" по 5 страниц


$limit=5;
$fatal=0;
$center=2;
$p=$_GET['page']<1?1:$_GET['page'];
if(($p-$limit)>1) echo "<a href=pages.php?id_categ=$id_categ&page=".($p-$limit)."><<</a>\n";
for($i=-$center;$i<($limit-$center);$i++)
{
$page=$i+$p;
if($page>0)
if($page==$p) echo "<a href=pages.php?id_categ=$id_categ&page=".$page."><b><font size=4>".$page."</font></b></a>\n";
else echo "<a href=pages.php?id_categ=$id_categ&page=".$page.">".$page."</a>\n";
else $fatal++; //понадобится если код доводить до полной готовности
}

echo "<a href=pages.php?id_categ=$id_categ&page=".($limit+$p).">>></a>\n";

Пару строчек изменилось.

NS
На сайте с 20.12.2006
Offline
37
#7

2Agel Nash, твой код косячный:

- выдает большое количество несуществующих страниц

- как-то нехорошо движется в списке страница

посмотри на сайте http://add2.ru/ там навигация вверху,

если клацнешь на ">>" то появляется список из следующей 20-ки страниц, и так далее - просто и понятно.

здесь аналогично надо

Agel Nash
На сайте с 01.12.2008
Offline
61
#8

отписал в личку рабочий код. Не проще ли было сразу указать пример, а на скриншот с неточным объяснением?

denex
На сайте с 29.04.2009
Offline
7
#9

Я всегда вывожу подобным образом:


<?

function link_bar($page, $pages_count)
{

for ($j = 1; $j <= $pages_count; $j++)
{
if ($j == $page)
{
echo $j.'&nbsp;';
}
else
{
echo "<a href=?page=".$j.">".$j."</a> ";
}

if ($j != $pages_count)
echo '';
}
return true;
}

$perpage = 10; // Ключевой момент

if (empty($_GET['page']) || ($_GET['page'] <= 0))
{
$page = 1;
}
else
{
$page = (int)$_GET['page'];
}

$count = mysql_num_rows(mysql_query("SELECT * FROM `content`"));


$pages_count = ceil($count / $perpage);

if ($page > $pages_count)
$page = $pages_count;

$start_pos = ($page - 1) * $perpage;


$query= "SELECT * FROM `cp_news` ORDER BY `news_id` DESC LIMIT $start_pos, $perpage";
$result=mysql_query($query);


link_bar($page, $pages_count);

?>
Создание Интернет-проектов любой сложности (социальные сети, медиа-порталы, сайты-визитки, Интернет-магазины, CMS и т.д.) (http://www.tyurin.net)
[Удален]
#10

Пользуюсь давно написанной функцией:

//Генерациястроки перехода по страницам
//$count - количество страниц
//$current - текущий элемент
//$url - урл, на который ссылаются. &id& заменяется на порядковый номер элемента http://site.ru/page%id&.html
//$nextpreview - далее-назад
//$firstlast - в начало-в конец
//$separator - разделитель элементов
//$view - количество элементов, которые показывать
function content_pageline($count,$current,$url,$nextpreview=false,$firstlast=false,$separator='',$view=0)
{
if($separator=='')$separator=' ';
if($view==0)$view=intval(6);//Страниц в группе
if($view>$count)$view=$count;
$str=array();
if($count<=$view)
{
for($i=1;$i<=$view;$i++)if($current!=$i)$str[]='<a href="'.str_replace('&id&',$i,$url).'">'.$i.'</a>';else$str[]='<b>'.$i.'</b>';
}
elseif($current<=$count && $current>=1)
{
$length=$view-2;
$from=intval($current-($length/2));
if($from<2)$from=2;
$to=$from+$length;
if($to>=$count)
{
$from=$count-$length-1;
$to=$count-1;
}
if($current!=1)$str[]='<a href="'.str_replace('&id&',1,$url).'">1</a>'.($from>2?'...':'');else$str[]='<b>1</b>';
for($i=$from;$i<=$to;$i++)if($current!=$i)$str[]='<a href="'.str_replace('&id&',$i,$url).'">'.$i.'</a>';else$str[]='<b>'.$i.'</b>';
if($current!=$count)$str[]=($to<($count-1)?'...':'').'<a href="'.str_replace('&id&',$count,$url).'">'.$count.'</a>';else$str[]='<b>'.$count.'</b>';
}
else return false;
$str=implode($separator,$str);
if($nextpreview)$str=($current!=1 ? ('<a href="'.str_replace('&id&',($current-1),$url).'">Назад</a>'.$separator):'').$str.($current!=$count ? ($separator.'<a href="'.str_replace('&id&',($current+1),$url).'">Далее</a>'):'');
if($firstlast)$str=($current!=1 ? ('<a href="'.str_replace('&id&',1,$url).'">В начало</a>'.$separator):'').$str.($current!=$count ? ($separator.'<a href="'.str_replace('&id&',$count,$url).'">В конец</a>'):'');
return $str;
}
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий