2010-09-15 2 views
0

J'ai une page CGI avec une table qui est peuplée en récupérant les données de la base de données, dans un mot c'est comme un DATAGRID.Comment puis-je faire la pagination dans mon script Perl CGI?

Et juste à la fin en bas à droite de la grille tha je besoin d'un lien comme « First < < 1 2 >> Dernière » ou comme « | < <>> | » en cliquant que je peux naviguer çà et là la enregistrements. Et j'ai l'intention d'avoir "10" enregistrements par page.

En surfant j'ai eu un morceau de code que je vais coller dans le champ de code. Mais le problème est qu'il affiche le lien de pagination quelque chose comme ceci "1 2 3 4 5 ..et ainsi de suite". Mais je ne suis pas prêt à avoir ce format de pagination, car le nombre d'enregistrements augmente la longueur du lien continue également d'augmenter. Donc, ce code peut-il être modifié au format que j'ai l'intention d'avoir?

#!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>"; 


--------------------------------------------------------------------------------------- 
+0

conseils généraux: CGI a des fonctions pour générer HTML. Utilise les. Ils vous aideront à générer du code HTML et à rendre votre code plus lisible. – reinierpost

+0

duplicata possible de [Comment puis-je faire pagination et de tri dans un programme CGI Perl?] (Http://stackoverflow.com/questions/3707646/how-can-i-do-paging-and-sorting-in-a- perl-cgi-program) –

+1

Nous avons répondu à cette question hier: [Comment faire du pagination et du tri dans un programme Perl CGI?] (http: // stackoverflow.com/questions/3707646/how-can-i-do-pagination-et-tri-dans-un-perl-cgi-programme) –

Répondre

1

Si tout ce que vous n'aimez pas sont les liens, alors vous pouvez modifier la boucle à la fin pour imprimer les liens que vous voulez. C'est juste une question de manipulation des numéros de page.

(Je ne sais pas où vous avez obtenu ce code, mais "page 0" n'est pas facile à utiliser même pour les programmeurs qui travaillent avec 0 offset depuis des décennies! Et si vous connaissez la taille de votre page, le décalage est les données inutiles, et comme il indique plus la taille de la page, il est également mal)

Ainsi, le plus simple changement est la suivante:.

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>]; 
} 

Juste une remarque: pas un lien vers la page en cours permet une compréhension utilisateur plus rapide où ils sont dans la liste. Aussi, cela signifie qu'ils ne peuvent pas frapper le serveur juste pour recharger la page. Vous voulez être en mesure de communiquer clairement qu'ils sont déjà sur la première ou la dernière page.

Cependant, une partie de votre question est de savoir comment le faire en Perl CGI. À l'aide réelle CGI Perl, vous n'avez pas print '<td>'. Vous utilisez des méthodes pour créer des tags:

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) 
    ); 

Vous devez noter que je aussi modifié pour que votre première page est # 1 ainsi.

Comme vous avez indiqué que vous voudrez peut-être quelques numéros de page, ainsi, le seul ajustement je devais faire était de calculer la plage min-max, comme ceci:

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)); 

Et utiliser ces valeurs pour ajouter liens page numérotée à la liste transmise à la création map@cells:

([ 1     => '|&lt;' ] 
    , [ ($pageNum - 1) => '&lt;' ] 
    , (map { [ $_ => $_ ] } $min_page..$max_page) 
    , [ ($pageNum + 1) => '&gt;' ] 
    , [ $numofPages  => '&gt;|' ] 
) 
+0

Merci beaucoup pour l'aide Mr.axeman, je vais passer par le code et revenir à vous une fois que vous avez terminé avec lui et si je suis confronté à un problème de mise en œuvre. Merci. – sonya

+0

Bonjour, j'ai essayé d'utiliser le code ci-dessus bt j'ai eu des erreurs à savoir à la ligne ..? $ Query-> a ({href => "? PageNum = $ page"}, $ text) [ERREUR: Can ' t appeler la méthode "a" sur la ligne de référence non balisée 98.] ". Qu'est-ce que cette référence non-précieuse et comment je peux l'éliminer? S'il vous plaît, Sombody peut m'aider à résoudre ce problème? Je vous remercie. – sonya

+0

@sonya: Le code initialement affiché avait 'my $ query = new CGI;' Ma suggestion était de remplacer * parties * du script par un nouveau comportement, pas comme une réécriture. Si 'CGI-> new' renvoie' undef', vous avez un tout autre problème. – Axeman

2

Je pense que vous voulez probablement Data::Pageset.

+0

Tout d'abord, je tiens à vous remercier pour votre réponse instantanée.Sir j'ai traversé le lien que vous avez spécifié et j'ai téléchargé le fichier tar disponible dans D Drive.Mais j'ai été confondu comme quel code et où je suis supposé mettre dans mon code. Donc j'ai collé mon code aussi bien dans le champ de code maintenant. Tellement gentil S'il vous plaît me guider sur ce qu'il faut faire plus loin. Merci Monsieur. – sonya

+0

Vous devez l'installer. Perl a un système pour cela. Tapez 'cpan Data :: Pageset' dans un shell et (si le shell peut trouver la commande cpan) le code ne sera pas seulement téléchargé, il sera également installé et ses dépendances aussi. – reinierpost

+0

Qu'est-ce qui se passe avec tous les "monsieur" et "patron" es dernièrement? – Ether

Questions connexes