Автор Тема: Постраничный вывод  (Прочитано 3369 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alex V. White

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Постраничный вывод
« : 07 Сентября 2005, 15:24:11 »
Необходимо сделать постраничный вывод данных из очень большого каталога. Как разбить на страницы понятно (и в форуме обсуждалось). Подскажите как сделать что бы ссылки на страницы выводились на все сразу, т.е.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 101
так не красиво (особенно если эти линки займут несколько строк),
а пачками по 10 (например) штук, т.е.
<>
Спасибо!

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Постраничный вывод
« Ответ #1 : 07 Сентября 2005, 17:13:42 »
передавать значение текущей страницы и в зависимости от него строить.
The documentations is your friend

Оффлайн Корепанов Иван

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 27
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Постраничный вывод
« Ответ #2 : 07 Сентября 2005, 18:26:43 »
100% гарантии работы дать не могу - не тестировал, написал и вставил код:

#!/usr/bin/perl

print "Content-type: text/html\\n\\n";
use CGI qw/:all/;

$dozen=param(\'dozen\');                 #êàêóþ äåñÿòêó ìû âûâîäèì
$page=param(\'page\');                   #âûáðàííàÿ ñòðàíèöà
if ((!$dozen)&&(!$page)){$dozen=0}
if ((!$dozen)&&($page)){$dozen=int ($page/10)}
if (!$page){$page=$dozen*10+1}

$count=30;                             #êîëè÷åñòâî íàèìåíîâàíèé êàòàëîãà íà ñòðàíèöå
$file_catalog="catalog.txt";           #ôàéë ñ êàòàëîãîì
$link_catalog="catalog.htm";           #ñòðàíèöà, ñ êîòîðîé âûçûâàåòñÿ ýòà ïðîãðàììà

open (F, $file_catalog);
@all=;
close (F);

if ($dozen!=0){print "< ";}
print "| ";
$first=$dozen*10-10;
$last=$dozen*10;

for ($i=$first; $i<$last; $i++){
print "
$i | ";
                               }

if ($#all<($dozen*10+10)){print "next.10>>";}
#äàëüøå èäåò âûâîä êàòàëîãà



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

Оффлайн Alex V. White

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 20
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Постраничный вывод
« Ответ #3 : 13 Сентября 2005, 15:11:19 »
Вот полное решение этой задачи (приснилось на выходные):

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, " [
// здесь можите напихать туда свои параметры

push (@nav_link, ">prev.
]");   //закрываем ссылку
   }

// дальше рисуем ссылку на предыдущие 10 страниц
if ($start_pos <= (5*$page_size))
   {
   #push (@nav_link, " prev.10");
   }
   else
   {
my $prev_nav = $start_nav - $page_size;

   push (@nav_link, " [}

push (@nav_link, ">prev.10
]");   
   }

// рисуем ссылки на страницы

   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, " ".$page_no." ");
      }
      else
      {
      my $pag = $page_no*$page_size;
      
      push (@nav_link, " [

push (@nav_link, ">$page_no
]");   
   
      }
   }

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

   push (@nav_link, " [
push (@nav_link, ">next 10
]");   
   
   }

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

   push (@nav_link, " [
push (@nav_link, ">next
]");   
   
   }

// заканчиваем и печатаем всю эту лабуду

@nav_link=join("",@nav_link);
print "
@nav_link
\\n";

}

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

Последний вопрос - нафига я это так все ПОДРОБНО описываю?
Для тех кому это на самом деле надо! И кого коцают умные предложения читать мануал! Кто либо, когда либо что то понял в перлдок по модулям сторонних разработчиков?

Отдельное спасибо за помощь Корепанов Иван

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28