Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как вывести например только 10 номеров страниц из


Автор: Гриша 30.12.2005, 16:14
Здравствуйте.
Приведенная ниже часть скрипта выводит номера страниц в виде ссылок.
Прошу вас помочь мне в том, чтобы например если у меня всего 30 страниц, то возможно было выводить например по 10 номеров страниц, тут возможно 2 варианта:
1) либо например пользователь нажимает на страницу 2 и тогда отображаются страницы со 2 по 10
2) либо когда пользовательнапример переходит на 10 страницу, то отображаются страницы с 10 по 20.
Вот как-то хотелось бы преобразовать вывод.

Код

// количество записей, выводимых на странице 
$per_page=10; 

// дальше выводим ссылки на страницы: 
$q="SELECT count(*) FROM `table`"; 
$res=mysql_query($q); 
$row=mysql_fetch_row($res); 
$total_rows=$row[0]; 

$num_pages=ceil($total_rows/$per_page); 

for($i=1;$i<=$num_pages;$i++) { 
  if ($i-1 == $page) { 
    echo $i." "; 
  } else { 
    echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> "; 
  } 
}



$num_pages - как раз выводит количество страниц, вот я пробовла в цикле делать условие if ($num_pages<=10), но что-то это не то.

Автор: Гриша 30.12.2005, 17:54
Код

if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;  
// или if ((!empty($_GET['page'])) && ($_GET['page'] > 0)) {$page=$_GET['page']-1;} else {$page=0;} 

$num_pages=ceil($total_rows/$per_page);    

$pergroup = 10;   

$groupnumber = floor($page/$pergroup);   
//for($i=1;$i<=$num_pages;$i++)    
for($i=$groupnumber*$pergroup;$i<$groupnumber*$pergroup+10;$i++) {    
  if ($i-1 == $page) {    
    echo $i." ";    
  } else {    
    echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";    
  }    
}



Почти все получается, но нумерация страниц начинает с 0, поэтому с начала иде так 0 ....... 9, на десятую страницу я могу попасть только нажав кнопку следующая, когда я попадаю на 10 страницу то нумерация страниц отображается также 0 ...... 9, при попадании на 11 страницу, нумерация идет так 10 ..... 17 - УЧИТЫВАЯ ЧТО ВСЕГо У МЕНЯ 18 страниц.

Автор: Mal Hack 30.12.2005, 19:55
Гриша это математика... Внимательно продумай алгоритм..

Автор: Гриша 30.12.2005, 20:52
Я с утра думаю с 12:30, вот ка раз только отдохнул, блин и никак не придумаю.

Автор: Mal Hack 30.12.2005, 23:21
Код

<?php

$per = 10;
$all = 35;
$cur = 14;

$start = floor( $cur / $per ) * $per;
$end   = $start + ( ( $all - $start < $per ) ? $all - $start : 10 );

for( $i = $start ; $i < $end ; $i++ )
 {
  print $i . "<br />";
 }

?>

Автор: Гриша 2.1.2006, 17:46
Mal Hack, спасибо за помощь.
Я всетаки сделал вывод страниц таким образом, вот полный php код.

Страницы выводятся таким образом.
К примеру у нас 30 страниц, и мы хотим выводить по 10 страниц:
# Первые 10, при нажатии на ... попадаем на следующие 10
1 2 3 4 5 6 7 8 9 10 ...
<< следующая предыдущая >>
# Вторые 10, при нажатии на ... попадаем на предыдущие 10 или нажимаем на ..., которые спарва, попадаем на следущие 10
... 11 12 13 14 15 16 17 18 19 20 ...
<< следующая предыдущая >>
# Третьи 10, при нажатии на ... попадаем на предыдущие 10
... 21 22 23 24 25 26 27 28 29 30
<< следующая предыдущая >>

Достаточно поменять $pergroup на нужное кол-во страниц в блоке и все, красота.

============================================

Код

// количество записей, выводимых на странице 
$per_page=10; 
// получаем номер страницы 
if (isset($_GET['page']) && ($_GET['page'] > 0)) $page=($_GET['page']-1); else $page=0; // Мленькое добавленице  && ($_GET['page'] > 0) - так, что если страница равна 0 или -1 и т.д., то отбражается первая страница 
// вычисляем первый оператор для LIMIT 
$start=abs($page*$per_page); 
// составляем запрос и выводим записи 
// переменную $start используем, как нумератор записей. 
$q="SELECT * FROM `table` ORDER BY field LIMIT $start,$per_page"; 
$res=mysql_query($q); 
while($row=mysql_fetch_array($res)) { 
  echo ++$start.". ".$row['field']."<br>\n"; 
} 

// дальше выводим ссылки на страницы: 
$q="SELECT count(*) FROM `table`"; 
$res=mysql_query($q); 
$row=mysql_fetch_row($res); 
$total_rows=$row[0]; 
$num_pages=ceil($total_rows/$per_page); 

$pergroup=10; //Определяем кол-во выводимых страниц в группе 
$groupnumber = floor($page/$pergroup); //Определяем номер группы из указанного кол-ва страниц 
$gropuprevious = $groupnumber*$pergroup; //Определяем предыдущую страницу текущей группы  
$groupnext = min($groupnumber*$pergroup+$pergroup,$num_pages); //Определяем следующую страницу после текущей группы 

if ($gropuprevious>=$pergroup) //Выводим ссылку предыдущей страницы текущей группы 
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.$gropuprevious.'">...</a> '; 

for($i=$gropuprevious+1;$i<=$groupnext;$i++) //Выводим страницы в виде ссылок по группам в указанном кол-ве, текущие страницы выводим без ссылок 
//for($i=1;$i<=$num_pages;$i++) { 
  if ($i-1 == $page) { 
    echo $i." "; 
  } else { 
    echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> "; 
  } 
} 

if ($groupnext<$num_pages) //Вывожу ссылку на следующу страницу после текущей группы 
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($groupnext+1).'">...</a> '; 

echo '<br>'; 

if ($page+1>1) //Если страница не последня, то вывожу кнопку previous (предыдущая) 
 { 
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.$page.'"><< предыдущая</a> &nbsp;'; 
 } 
elseif ($num_pages>1) //Если страница одна то не выводим эту ссылку     
echo '<< предыдущая &nbsp;';  

if ($page+1<$num_pages) //Если страница не последня, то вывожу кнопку next (следующая) 
{ 
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($page+2).'">cледующая >></a>'; 
} 
elseif ($num_pages>1) //Если страница одна то не выводим эту ссылку     
echo 'cледующая >>';

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)