Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Постраничный вывод

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

AlexVW

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Необходимо сделать постраничный вывод данных из очень большого каталога. Как разбить на страницы понятно. Подскажите как сделать что бы ссылки на страницы выводились на все сразу, т.е.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 101
так не красиво (особенно если эти линки займут несколько строк),
а пачками по 10 (например) штук, т.е.
<<prev.10 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | next10>>
Спасибо!

Всего записей: 29 | Зарегистр. 09-09-2002 | Отправлено: 15:28 07-09-2005
Advanced_Guest



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexVW
в самом сообщении надо указывать язык, на котором пишешь.( а не в описании)
 
а алгоритм такой:
 
Узнаём номер текущей страницы, и отнимаем например 5  - это будет "первая" страница
добавляем к первой странице 10, получаем "последнюю" страницу.
 
И генерируем список. от первой до последней.
 
В чём проблема то ?


----------
The Abyss - UO, LA2, Ботва, BSFG

Всего записей: 2446 | Зарегистр. 14-04-2002 | Отправлено: 15:47 07-09-2005
Aleksanders



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Другой вариант - номер страницы делим на 10, берем от результата целую часть и умножаем на 10, а потом к полученной величине прибавляем 0...10

----------
LINUX = Linux Is Not a UniX

Всего записей: 1428 | Зарегистр. 07-07-2002 | Отправлено: 11:02 08-09-2005
6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AlexVW
Посмотри здесь. Правда это для ПХП, но думаю сможешь переписать на Перл.

----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 11:16 08-09-2005 | Исправлено: 6epcepk, 11:17 08-09-2005
AlexVW

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот полное решение этой задачи (приснилось на выходные):
 
my $start_pos = param ("start_pos"); //текущая страница для просмотра
 
my $page_size = 10; //количество данных на странице
 
my $max_rec  = param ("max_rec"); //всего записей в базе, как подсчитать сообразите, если не указано (при первом запуске) - значит надо подсчитать
 
my @nav_link; //массив навигационных связей
my $start_nav; //первая страница навигации
my $end_nav; //последняя страница навигации, т.е. на экран выводятся не все 154 ссылки на страницы, а только 10 (или сколько хотите), вот первая и последняя это и есть начало и конец этого блока ссылок
 
if (!defined (param ("start_pos")))
{
$start_pos = 0;
$max_rec = 0;
//подсчитываем количество записей в базе ($max_rec)
}
 
if ($max_rec > $page_size) //если страниц больше одной
{
 
$start_nav = $start_pos - 5*$page_size; //подсчитываем первую страницу блока ссылок (5 - это 10/2, т.е. если всего видимых ссылок у вас будет 10)
 
if ($start_nav < 0) { //если первая страница левее нуля сдвигаем последнюю в право на это количество
 
$end_nav = $start_pos + 5*$page_size + abs($start_nav);
$start_nav = 0;
}
else { // или высчитываем последнюю страницу без понтов
$end_nav = $start_pos + 5*$page_size;
}
if ($end_nav > $max_rec) { //если последняя страница больше количества записей всего
 
$end_nav = $max_rec;
}
 
if ($start_pos == 0) //если находимся на первой странице - значит предыдущих нет
{
#push (@nav_link, "prev."); //выталкиваем в массив навигации неактивную ссылку на предыдущую страницу (у меня она не печатается)
}
else //если находимся не на первой стр.
{
my $prev = $start_pos-$page_size; //вычисляем ссылку на предыдущую страницу
 
push (@nav_link, "&nbsp;[<a href=?start_pos=$prev&max_rec=$max_rec"); //пихаем в навигацию ссылку на предыдущую страницу
 
// здесь можите напихать туда свои параметры
 
push (@nav_link, ">prev.</a>]"); //закрываем ссылку
}
 
// дальше рисуем ссылку на предыдущие 10 страниц
if ($start_pos <= (5*$page_size))
{
#push (@nav_link, "&nbsp;prev.10");
}
else
{
my $prev_nav = $start_nav - $page_size;
 
push (@nav_link, "&nbsp;[<a href=?start_pos=$prev_nav&max_rec=$max_rec");
}
 
push (@nav_link, ">prev.10</a>]");
}
 
// рисуем ссылки на страницы
 
for (my $i = $start_nav; $i < $end_nav; $i += $page_size)
{
my $page_no = int ($i/$page_size) + 1;
if ($start_pos == $i)
{
push (@nav_link, "&nbsp;".$page_no."&nbsp;");
}
else
{
my $pag = $page_no*$page_size;

push (@nav_link, "&nbsp;[<a href=?start_pos=$i&max_rec=$max_rec");
 
 
push (@nav_link, ">$page_no</a>]");

}
}
 
// ссылка на следующие 10 страниц
if (($start_pos+5*$page_size) >= $max_rec)
{
#push (@nav_link, "&nbsp;next");
}
else
{
my $next_nav = $end_nav;
 
push (@nav_link, "&nbsp;[<a href=?start_pos=$next_nav&max_rec=$max_rec");
 
push (@nav_link, ">next&nbsp;10</a>]");

}
 
// ссылка на следующую страницу
if ($start_pos+$page_size > $max_rec)
{
push (@nav_link, "&nbsp;next");
}
else
{
my $next = $start_pos+$page_size;
 
push (@nav_link, "&nbsp;[<a href=?start_pos=$next&max_rec=$max_rec");
 
push (@nav_link, ">next</a>]");

}
 
// заканчиваем и печатаем всю эту лабуду
 
@nav_link=join("",@nav_link);
print "<center>@nav_link</center>\n";
 
}
 
Этот код 100% работает (стоит у меня на сайте)
Если где то допустил ошибку - зазвиняйте, у меня в ссылки передаются куча параметров, я их убирал и мог где то промазать.
 
Последний вопрос - нафига я это так все ПОДРОБНО описываю?
Для тех кому это на самом деле надо! И кого коцают умные предложения читать мануал! Кто либо, когда либо что то понял в перлдок по модулям сторонних разработчиков?
 
Отдельное спасибо за помощь Корепанов Иван

Всего записей: 29 | Зарегистр. 09-09-2002 | Отправлено: 15:14 13-09-2005
Break_Action



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот еще вариант кода, в нем реализовани смещение по страницам по одной и получается, что активная страница находится всегда по центру всей навигации.
Если ко необходимо можно дописать Первую и Последнюю страницы.
 

Код:
 
sub navigator
{
($data{page},$total_users)=@_;
 
$pages=int($total_users/$quantity);
if (int($total_users/$quantity) != ($total_users/$quantity))
{
  $pages++;
}
$data{num}=$data{page}/$quantity;
if ($pages>7)
{
  if ($data{num}<4)
  {
    $p=0;
    while($p<7)
    {
      $navigation.=qq~<a href="$url_cgi/globalizer.pl?method=$data{method}~;
      $navigation.=qq~&code=$data{code}~ if ($data{code});
      $navigation.=qq~&showonly=$data{showonly}~ if ($data{showonly});
      $navigation.=qq~&show_date=$data{show_date}~ if ($data{show_date});
      $navigation.=qq~&start_date=$data{start_date}&end_date=$data{end_date}~ if ($data{start_date} && $data{end_date});
      $sp=$p*$quantity;$op=$p+1;
      $op=qq~[<b>$op</b>]~ if ($sp==$data{page});
      $navigation.=qq~&page=$sp">$op</a>&nbsp;&nbsp;~;
      $p++;
    }
  }
  else
  {
    if ($pages-$data{num}<4)
    {
      $last=$pages;
      $p=$last-7;
    }
    else
    {
      $last=$data{num}+3;
      $p=$last-7;
    }
    while($p<$last)
    {
      $navigation.=qq~<a href="$url_cgi/globalizer.pl?method=$data{method}~;
      $navigation.=qq~&code=$data{code}~ if ($data{code});
      $navigation.=qq~&showonly=$data{showonly}~ if ($data{showonly});
      $navigation.=qq~&show_date=$data{show_date}~ if ($data{show_date});
      $navigation.=qq~&start_date=$data{start_date}&end_date=$data{end_date}~ if ($data{start_date} && $data{end_date});
      $sp=$p*$quantity;$op=$p+1;
      $op=qq~[<b>$op</b>]~ if ($sp==$data{page});
      $navigation.=qq~&page=$sp">$op</a>&nbsp;&nbsp;~;
      $p++;
    }
  }
}
else
{
  $p=0;
  while($p<$pages)
  {
    $navigation.=qq~<a href="$url_cgi/globalizer.pl?method=$data{method}~;
    $navigation.=qq~&code=$data{code}~ if ($data{code});
    $navigation.=qq~&showonly=$data{showonly}~ if ($data{showonly});
    $navigation.=qq~&show_date=$data{show_date}~ if ($data{show_date});
    $navigation.=qq~&start_date=$data{start_date}&end_date=$data{end_date}~ if ($data{start_date} && $data{end_date});
    $sp=$p*$quantity;$op=$p+1;
    $op=qq~[<b>$op</b>]~ if ($sp==$data{page});
    $navigation.=qq~&page=$sp">$op</a>&nbsp;&nbsp;~;
    $p++;
  }
}
 
return $navigation;
}
 

Всего записей: 296 | Зарегистр. 12-09-2001 | Отправлено: 16:05 13-09-2005
nicy



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Этот код 100% работает (стоит у меня на сайте)  
Если где то допустил ошибку - зазвиняйте, у меня в ссылки передаются куча параметров, я их убирал и мог где то промазать.

Ты забыл сказать что для этого когда нужен CGI.pm. И у тебя пробелы между названием функции и передачей её параметров тип somefunc (""); a должно быть somefunc("");.
Это всё для того что бы потом небыло вопросов почему код не пашет.

Всего записей: 198 | Зарегистр. 09-01-2002 | Отправлено: 08:19 14-09-2005
yarnik



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
я сделал у себя так:

Код:
 
 
if ($list eq "") {
  $list=int($alllist);
  if ($list < $alllist) { $list++; }
}
 
for ($a=1;$a<$alllist+1;$a++) {
  if ($a == $list) { print " =$a= "; }
  elsif ($a == 1) { print qq[$a .]; }
  elsif ($a >= $alllist) { print qq[. $a]; }
  elsif ($a > $list-4 && $a < $list+4) { print qq[. $a .]; }
  elsif ($a > $list-5 && $a < $list+5 ) { print ". ."; }
}
 

результат выглядит так:
Страница  1 .. .. 54 .. 55 .. 56 . =57=

Всего записей: 275 | Зарегистр. 09-06-2004 | Отправлено: 19:34 13-09-2006
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Постраничный вывод


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru