Как я могу сделать нумерацию страниц в моем скрипте Perl CGI? - PullRequest
0 голосов
/ 15 сентября 2010

У меня есть страница CGI с таблицей, которая заполняется путем извлечения данных из базы данных, словом, как DATAGRID.

И только в правом нижнем углу сетки мне нужна ссылка типа "Первый << 1 2 >> Последний" или, например, «| <<>> |» при нажатии, чтобы перемещаться по записям. И у меня будет 10 записей на страницу.

Во время серфинга я получил кусок кода, который собираюсь вставить в поле кода. Но проблема в том, что он отображает ссылку на пейджинг примерно так: «1 2 3 4 5 .. и так далее». Но я не желаю иметь такой формат подкачки, потому что количество записей увеличивается, длина ссылки также продолжает увеличиваться. Так может ли этот код быть изменен в формате, который я собираюсь иметь?

#!C:\perl\bin\perl.exe -wT

use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use strict;
use warnings;
use DBI;
my $query = new CGI;
my $bornum;
my $itemnum;
my $i;
my @overduedata;
my $pageNum =$query->param('pageNum');
print "Content-Type: text/html\n\n";

unless($pageNum) {
   $pageNum=0;
 }
my $offset=$query->param('offset');
unless($offset) {
    $offset=10;
 }
$i=0;
my $numOfRec = 100;
while ($i < $numOfRec){
   $bornum = "bornum" . $i;
   $itemnum = "itmnum" . $i;
   push (@overduedata, { bornum => $bornum, itemnum => $itemnum });
   $i = $i + 1;
 }

print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">";
print "\n<form>";
print "\nNo: of records per page : <input type=text name=offset>";
print "\n<input type=submit value=submit>";
print "\n</form>";
print "\n<br> No: of rec per page = " . $offset . " -- pageNum = " . $pageNum ;
print "<table border=1>";

my $startDisplay = ($pageNum) * $offset;
my $endDisplay = ($pageNum + 1) * $offset;
$i = $startDisplay;
while ($i < $endDisplay){
   print "<tr><td>" . $i . "</td><td>" . $overduedata[$i]->{'bornum'} . "</td><td>" .
          $overduedata[$i]->{'itemnum'} . "</td></tr>";
   $i = $i + 1;
 }
print "</table>";

my $numofPages = $numOfRec / $offset;
$i = 0;
print "<table border=1><tr>";
while ($i < $numofPages){
     print "<td> <a href = ?pageNum=" . $i . "&offset=" . $offset . ">" . 
             $i . "</a></td>";
     $i = $i + 1;
}
print "<tr></table>";


---------------------------------------------------------------------------------------

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Я думаю, что вы, вероятно, хотите Data :: Pageset .

1 голос
/ 15 сентября 2010

Если все, что вам не нравится, это ссылки, то вы можете изменить цикл в конце, чтобы напечатать нужные ссылки. Это просто вопрос манипулирования номерами страниц.

(Я не знаю, откуда у вас этот код, но «страница 0» не удобна даже для программистов, которые десятилетиями работали со смещением 0! А если вы знаете размер вашей страницы, то смещение не нужно данные, и поскольку это указывает на больший размер страницы, это также неправильно .)

Итак, самое простое изменение:

my $pageN;
if ( $pageNum > 0 ) { 
    print q[<td><a href="?pageNum=1">|&lt;</a></td>];
    $pageN  = $pageNum - 1;
    print qq[<td><a href="?pageNum=$pageN">&lt;</a></td>];
}
else  { # don't link to the current page
    print q[<td><span class="currentpage">|&lt;</span></td>];
    print q[<td><span class="currentpage">&lt;</span></td>];

}

if ( $pageNum < ( $numofPages - 1 )) { 
    $pageN  = $pageNum + 1;
    print qq[<td><a href="?pageNum=$pageN">&gt;</a></td>];
    print qq[<td><a href="?pageNum=$numofPages">&gt;|</a></td>];
}
else { # don't link to the current page
    print q[<td><span class="currentpage">&gt;</span></td>];
    print q[<td><span class="currentpage">&gt;|</span></td>];
}

Просто примечание: отсутствие ссылки на текущую страницу помогает пользователю быстрее понять, где он находится в списке. Также это означает, что они не могут попасть на сервер просто , чтобы перезагрузить страницу. Вы хотите иметь возможность четко сообщить, что они уже находятся на первой или последней странице.

Однако, часть вашего вопроса заключается в том, как бы вы сделали это в Perl CGI . Используя настоящий Perl CGI, вы не print '<td>'. Вы используете методы для создания тегов:

my @cells 
    = map { 
        my ( $page, $text ) = @$_;
        ( $query->td(
                $page > 0 and $page <= $numofPages and $pageNum != $page 
                    ? $query->a( { href => "?pageNum=$page" }, $text )
                    : $query->span( { -class => 'currentpage' }, $text )
          ), "\n"
        )
    } ( [ 1                 => '|&lt;' ]
      , [ ( $pageNum - 1 )  => '&lt;'  ]
      , [ ( $pageNum + 1 )  => '&gt;'  ]
      , [ $numofPages       => '&gt;|' ]
      )
    ;

print $query->table( 
      { -class => 'pagenav', -border => 1 }
    , $query->Tr( { -class => 'pagenavrow' } @cells )
    );

Вы должны заметить, что я также изменил его, чтобы ваша первая страница тоже была # 1.

Поскольку вы указали, что вам могут понадобиться и некоторые номера страниц, единственным Корректировка, которую я должен был сделать, заключалась в том, чтобы вычислить минимальный и максимальный диапазон, например:

use List::Util qw<max min>;
my $min_page = max( 1, $pageNum - 5 );
my $max_page = min( $numofPages, $min_page + 10 );
$min_page    = max( 1, min( $min_page, $max_page - 10 ));

И используйте эти значения, чтобы добавить пронумерованные ссылки на страницы в список, переданный в map, создав @cells:

  ( [ 1                 => '|&lt;' ]
  , [ ( $pageNum - 1 )  => '&lt;'  ]
  , ( map { [ $_ => $_ ] } $min_page..$max_page )
  , [ ( $pageNum + 1 )  => '&gt;'  ]
  , [ $numofPages       => '&gt;|' ]
  ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...