Вывод 10 номер страниц из 30 в каталоге ссылок

Гриша К.

Новичок
Как вывести например только 10 номеров страниц из 30 номеров страниц

Здравствуйте.
Приведенная ниже часть скрипта (http://www.phpfaq.ru/paginator) выводит номера страниц в виде ссылок.
Прошу вас помочь мне в том, чтобы например если у меня всего 30 страниц, то возможно было выводить например по 10 номеров страниц, тут возможно 2 варианта:
1) либо например пользователь нажимает на страницу 2 и тогда отображаются страницы со 2 по 10
2) либо когда пользовательнапример переходит на 10 страницу, то отображаются страницы с 10 по 20.
Вот как-то хотелось бы преобразовать вывод.

PHP:
// количество записей, выводимых на странице
$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.05 14:09:

Вот щас попробовал еще изменить страку
PHP:
for($i=1;$i<=$num_pages;$i+=10)
получается, что выводятся страницы так
1 11 21 31

-~{}~ 30.12.05 14:50:

Я сам нека не могу додуматься до того, какое сделать условие, чтобы,чтобы выводилсоь по 10 страниц ($num_pages<=10)
 

white phoenix

Новичок
Задача элементарная. Есть $numpages = $total_row/$perpage;, больше нам ничего знать не надо. Объявляем сколько ссылок страницы должно быть в группе: $pergroup = 10;, затем $numgroups = $numpages/$pergroup;, а затем
PHP:
$groupnumber = floor($pagenumber/$pergroup);
for($i=$groupnumber*$pergroup;$i<$groupnumber*($pergroup+1);$i++)
{
 $pageforlink = $i;
}
Added: Вариант не совсем в соответствие с условием:
> 1) либо например пользователь нажимает на страницу 2 и тогда отображаются страницы со 2 по 10
Будут отображены с 1 по 10. Imho, так правильнее, но чтобы как условии:
PHP:
for($i=$groupnumber*$pergroup+$pagenumber%$pergroup;$i<$groupnumber*($pergroup+1);$i++)
 

Гриша К.

Новичок
white phoenix, спасибо за ответ. Мне очень тяжело понять ваш ответ.
Если делать так, то вывод идет с ошбками

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

$pergroup = 10;
$numgroups = $num_pages/$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> "; 
  } 
}
и $numgroups она получается просто так.

Помогите пожалуйста разобраться с вашим примером, возможно я чего-то недоганяю.
 

white phoenix

Новичок
Ты забыл строчку:
PHP:
$groupnumber = floor($pagenumber/$pergroup);
-~{}~ 30.12.05 15:13:

> $numgroups она получается просто так
Да, если она тебе будет нужна можешь её использовать.
 

Гриша К.

Новичок
В скрипте я ее не забыл, здесь только забыл.

Вот какой результат:
Notice: Undefined variable: pagenumber in E:\home\link\www\add_url\output_fns.php on line 67 ($groupnumber = floor($pagenumber/$pergroup);)

Вот как идет нумерация страниц:
0 1 2 3 4 5 6 8 9

Здесь явно $pagenumber имеетт нулевое значение, откуда она?
И вот эта строчка непонимаю зачем $numgroups = $num_pages/$pergroup;
$numgroups - нигде не используется

-~{}~ 30.12.05 15:33:

Объясните пожалуйста, что я не так сделал. Я никак не могу сам сделать такой вывод.
 

sakon

П..и.н..ок
Гриша К.
Скажи - ты всегда тупо вставляешь к себе чужой код? Или сначала думаешь, что в нем есть что?
 

Гриша К.

Новичок
Я подумал, мало что понял, решил просто втавить, чтобы посмотреть какой будет резульат ип отом уже корректировать.
sakon, если вы можете то помогите пожалуйста с решением.

-~{}~ 30.12.05 15:50:

Я уже 30 минут думаю над этим кодом и не могу с ним разобраться. Ну почему же если вы знаете, и вы зашли на форму, и отвечаете на сообщения, ни подсказать за одно и решения, как новогодни й подарок.
 

white phoenix

Новичок
Этот кусок скрипта я писал прям в форму быстрого ответа, не как готовое решение, а как объяснение принципа работы. pagenumber замени на page, это переменная в которой номер текущей страницы.
 

Гриша К.

Новичок
PHP:
if (isset($_GET['page'])) $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 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Мне непонятно почему получается так и как сделать чтобы получалось так как надо (как я написал в начале)

Пожалуйста, если вы занете как сделать правильно, напишите решение. Несоображаю я.
 

JIeoH

Guest
Гриша К.
Тыб посмотрел внимательнее!
... else $page=10;
 

Гриша К.

Новичок
$pages=$page+1;
$groupnumber = floor($pages/$pergroup);
но получается что $groupnumber всегда ровна 0, это наверное из-за функции floor.

Страницы отображаются с 0 по 9, дальше когда я например в ручную попадаю на 10 страницу, то отображаются с 10 по 19, а у меня там всего 18 страниц.
 

zarus

Хитрожопый макак
$i<$groupnumber*$pergroup+10
заменить на
$i<min($groupnumber*$pergroup+10,$num_pages)
PHP:
for($i=$groupnumber*$pergroup;$max=min($groupnumber*$pergroup+10,$num_pages),$i<$max;$i++) {
...
}
 

white phoenix

Новичок
Ну только всчет праздника.
> if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
Что это за зверь?
Замени на:
$page = is_numeric($_REQUEST['page'])?$_REQUEST['page']:0;
>Вот как в результате идут страницы:
> 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Бред, вышеприведенный цикл делает только 9 итераций.
 

Гриша К.

Новичок
Без floor - $groupnumber = 0.1 , 0.2 и т.д. Соответсвенно при переходе на вторую страницу отображаются страницы со 2 по 11, вроде бы уже что-то похожее.

Я сделать бы просто:
вот идут страницы 1 2 3 4 6 7 8 9 10 при нажатии на 10 страницу отображались следующие 10, т.е. 10 11 12 13 14 15 16 17 18 19 и т.д.
 

zarus

Хитрожопый макак
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
неверно!
PHP:
$_GET['page'] = intval($_GET['page']);
if ((!empty($_GET['page'])) && ($_GET['page'] > 0)) {$page=$_GET['page']-1;} else {$page=10;}
А то кто-нить добренький передаст тебе отрицательное значение, да и на 0 она будет направильно реагировать
 

Гриша К.

Новичок
zarus, спасибо большое, да теперь действительно если $page=0 или минусовое значение, то отображается первая страница, я знал об этом раньше, но не знал как исправить.

Я только, что заметил ваш пример выше, щас попробую.
 

JIeoH

Guest
Гриша К. Я тоже тока хотел дать этот ответ но позно :(
--------
<?php
...
if (isset($_GET['page'])) $page=($_GET['page']-1);
else $page=0;
$_GET['page'] = intval($_GET['page']);
if ((!empty($_GET['page'])) && ($_GET['page'] > 0)) {$page=$_GET['page']-1;}
else {$page=10;}
...
?>
 

Гриша К.

Новичок
white phoenix
страницы у меня так иду всегда, но когда я начинаю применять ваш вариант для разделения вывода страниц, они начинаются с 0.
Я уже просто запутался.

for($i=$groupnumber*$pergroup;$max=min($groupnumber*$pergroup+10,$num_pages),$i<$max;$i++)

в итоге страницы идут с 0 до 17

и даже если я сделаю так $page = is_numeric($_REQUEST['page'])?$_REQUEST['page']:0;
всеравно все тоже самое, потому что $i=$groupnumber*$pergroup; равно это 0, счет начинаетс с 0;
А если из $groupnumber = floor($page/$pergroup); убрать floor то ерундистика получается.

Я уже совсем запутался. Сума сойти можно.
Если вы знаете, ну пожалуйста напишите мне просто результат и все, мне нужен просто результат.

-~{}~ 30.12.05 17:30:

Вот тут я непонял зачем так
$_GET['page'] = intval($_GET['page']);
if ((!empty($_GET['page'])) && ($_GET['page'] > 0)) {$page=$_GET['page']-1;}
else {$page=10;}

Потому что здесь при значении -1 попадаем на 11 страницу, при 0 значении тоже попадаем на 11

Я попробовал сделать так все нормально
if ((!empty($_GET['page'])) && ($_GET['page'] > 0)) {$page=$_GET['page']-1;}
else {$page=0;}
как вы думаете так можно оставить. Я просто не знаю функци inval и empty.

-~{}~ 30.12.05 17:48:


===============================================
Вот собрался такой код

PHP:
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 страниц.

-~{}~ 30.12.05 17:59:

Непонимаю, неужели это настолько сложно, что никто не может так сделать или вообще никто так не делает, есть 100 номеров страниц, так они все и выводятся.
 
Сверху