Как выполнить сортировку на стороне клиента с помощью строки запроса в гиперссылке, связанной с заголовком таблицы, используя Perl? - PullRequest
0 голосов
/ 24 сентября 2010

Привет всем, я надеюсь, что у всех дела идут хорошо, На самом деле у меня есть таблица, в которой я получаю данные из базы данных sqlite, я сделал разбиение на страницы и фильтрацию для сетки с использованием perl, теперь мне нужно сделать сортировку. Я хочу сделать так: «СДЕЛАЙТЕ ТАБЛИЦУ ЖАТКИ, КАК ГИПЕРЛИНК, И КОГДА Я ЩЕЛКУЮ, ЧТО ЭТО ДОЛЖЕН СОРТИРОВАТЬ ТАБЛИЦУ В КАЧЕСТВЕ ИЛИ ПОСЛЕДУЮЩЕМУ». Пожалуйста, дайте мне знать, возможно ли это, если да, то, пожалуйста, помогите мне найти решение. ЗДЕСЬ мой код. Спасибо.

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

use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use strict;
use warnings;
use DBI;
use POSIX;
my $query = new CGI;
my $q = new CGI;
my $numofPages;
my $i;
my @overduedata;
my $pageN;
my @rows = ();
my $pageNum=$query->param('pageNum');
my $Id="";
my $Name="";
my @list;
my $var;
my $val;
my $filterexpression= " ";

print "Content-Type: text/html\n\n";
$query = $ENV{'QUERY_STRING'}; 
@list = split( /\&/, $query);  
 foreach (@list) {
  ($var, $val) = split(/=/);
  $val =~ s/\'//g;
  $val =~ s/\+/ /g;  
  $val =~ s/%(\w\w)/sprintf("%c", hex($1))/ge; 
  ($var, ' = ', $val,); 
 }  

 print <<END_HTML;
 <html>
 <head><title></title>
 </head>
 <body>
 <form action="Filtering.cgi" method="post">
 <TABLE>
  <TR>
   <TD>
     <input type="hidden" name="submit" value="Submit">
   </TD>
 </TR>
 </TABLE
 </form>
 </body></html>
 END_HTML


 my $dbh = DBI->connect("dbi:SQLite:DEVICE.db","", "",
        {
            RaiseError => 1,
            AutoCommit => 1
       }
    );
  unless($pageNum) {
      $pageNum=0;
      }

  my $offset;
   unless($offset) {
   $offset=11;
   }


 if ( $q->param("Filter") ) 
  {
   my $Id=$q->param('User_Id');
   my $Name=$q->param('User_Name');
  if ($Id ne "" )
      {
    $filterexpression= $filterexpression." UserId like '" .$Id. "%' and " ;
       }

  if ($Name ne "" )
  {
   $filterexpression= $filterexpression." UserName like '" .$Name. "%' and " ;
   }
   }
 $filterexpression= $filterexpression. " UserId > 0"  ;   

my $exp;
my $query =$dbh->selectall_arrayref("SELECT * FROM UsersList " ." where ".
     $filterexpression);
my $numOfRec=@$query ;
my $numofPages = ceil($numOfRec / $offset);
my $sql = "SELECT UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList " ." 
    where ". $filterexpression;
my $sth = $dbh->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr");
$sth->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr");
 my $query=$dbh->selectall_arrayref('SELECT
     UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList where '. 
      $filterexpression);
 my $exp = @$query;   
 while (my ($UserId,$UserName,$CardNo,$GroupId,$Role,$VerifyType) = $sth-
    >fetchrow_array())
   {
    push(@overduedata,{UserId=>$UserId,UserName=>$UserName,
   CardNo=>$CardNo,GroupId=>$GroupId,Role=>$Role,VerifyType=>$VerifyType});
    }
   my $startDisplay = ($pageNum)*$offset;  
   my $endDisplay = ($pageNum + 1 ) * $offset;  
   $i = $startDisplay; 
   my $sql = "SELECT UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList" ;
   my $sth = $dbh->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr");
   $sth->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr");

   print "<table class=\"tablestyle\">";
   print "<tr border=1 style='background-color:#CDC9C9'>
   <td class=\"tdstyle\" colspan=\"2\"></td>
   <td><A HREF=\"http://localhost/cgi-bin/AddUser.cgi\">ADD</A></td>
   <td><b>UserId</b></td>
   <td><input type=\"text\" name=\"User_Id\"  size=\"6\"></td>
   <td><b>UserName</b></td>
   <td><input type=\"text\" name=\"User_Name\"  size=\"10\"></td>
   <td><input type=\"submit\" name=\"Filter\" value=\"Filter\" ></td>
   </tr>";

  print "<tr class=\"trstyle1\"></tr>";
  print "<tr class=\"trstyle2\">";
  print "<th  class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
     Sortype=1\" class=\"hiddenlink\">$sth->{NAME}->[0]</A></th>";
  print "<th colspan=\"2\" class=\"thstyle\">A HREF=\"http://localhost/cgi-
     bin/Filtering.cgi?Sortype=2\" class=\"hiddenlink\">$sth->{NAME}->[1]</A></th>";
  print "<th  class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
     Sortype=3\" class=\"hiddenlink\">$sth->{NAME}->[2]</A></th>";
  print "<th  class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
     Sortype=4\" class=\"hiddenlink\">$sth->{NAME}->[3]</A></th>";
  print "<th  class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
     Sortype=5\" class=\"hiddenlink\">$sth->{NAME}->[4]</A></th>";
  print "<th  class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
     Sortype=6\" class=\"hiddenlink\">$sth->{NAME}->[5]</A></th>";
  print "<th  class=\"thstyle\">&nbsp;EDIT</th>";
  print "<th  class=\"thstyle\">&nbsp;DELETE</th>";
  print "</tr>";

   if($exp != 0)
     {
     while ($i < $endDisplay)
       {
      if($i == $exp){
       last;}
   print "<tr class=\"trstyle3\">
   <td >" . $overduedata[$i]->{'UserId'} .  "</td>
   <td colspan=\"2\" >" . $overduedata[$i]->{'UserName'} . "</td>
   <td>" . $overduedata[$i]->{'CardNo'} . "</td>
   <td>" . $overduedata[$i]->{'GroupId'} . "</td>
   <td>" . $overduedata[$i]->{'Role'} . "</td>
   <td>" . $overduedata[$i]->{'VerifyType'} . "</td>
   <td><A HREF=\"\">EDIT</A></td>
   <td><A HREF=\"\">DELETE</A></td>
   </tr>";
  $i = $i + 1;
     }
      }

  if ( $pageNum > 0 ) {
      print q[<td><a href="Filtering.cgi?pageNum=0&Sortype=$val">|&lt;</a></td>];  
         $pageN  = $pageNum - 1;
     print qq[<td><a href="Filtering.cgi?pageNum=$pageN&Sortype=$val">&lt;</a></td>];
     }
    else
    {
      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="Filtering.cgi?pageNum=$pageN&Sortype=$val">&gt;</a></td>];
   $numofPages=$numofPages-1;
   print qq[<td><a href="Filtering.cgi?
      pageNum=$numofPages&Sortype=$val">&gt;|</a></td>];
     }
   else {
          print q[<td><span class="currentpage">&gt;</span></td>];
          print q[<td><span class="currentpage">&gt;|</span></td>];
       }

   print "</table>";

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Сортировка таблицы на стороне клиента достигается с помощью Javascript.Существуют десятки библиотек, легко найденных простым веб-поиском . Стюарта Лэнгриджа sorttable очень легко реализовать.

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

Это не ответ на ваш вопрос, а общий совет.Поэтому я сделал это вики-сообществом.

Пожалуйста, прекратите писать сценарии CGI на некоторое время, пока не поймете, почему у вашего сценария есть серьезные проблемы.

У вас есть:

use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
# ...
my $query = new CGI;
my $q = new CGI;

Во-первых, обратите внимание, что вам нужно инициализировать объект CGI только один раз.Избегайте косвенных вызовов методов:

my $cgi = CGI->new;

Я знаю, что документы CGI.pm используют $query, но я считаю $cgi более значимым.

Это хороший шаг.Почти все CGI-скрипты должны использовать хорошо зарекомендовавшие себя библиотеки, а не доморощенный код.Тем не менее, после этого хорошего первого шага вы делаете:

print "Content-Type: text/html\n\n";
$query = $ENV{'QUERY_STRING'}; 
@list = split( /\&/, $query);  
 foreach (@list) {
  ($var, $val) = split(/=/);
  $val =~ s/\'//g;
  $val =~ s/\+/ /g;  
  $val =~ s/%(\w\w)/sprintf("%c", hex($1))/ge; 
  ($var, ' = ', $val,); 
 }  

Нет никаких оснований заниматься практикой культа груза.Ваш объект CGI уже имеет параметры, переданные в сценарий.

Кроме того, вы должны объявить свои переменные там, где они впервые используются, а не выводить их все в сценарии.

Использовать CGI.вечера header, чтобы отправить заголовок.У вас есть:

 print <<END_HTML;
 <html>
 <head><title></title>
 </head>
 <body>
 <form action="Filtering.cgi" method="post">
 <TABLE>
  <TR>
   <TD>
     <input type="hidden" name="submit" value="Submit">
   </TD>
 </TR>
 </TABLE
 </form>
 </body></html>
 END_HTML

, который не имеет смысла, поскольку вы отправили полный HTML-документ, прежде чем делать что-либо в скрипте.

Остальная часть кода не может изменить то, что вы уже отправили.

Поместите ваш HTML в шаблон.Лично мне нравится HTML :: Template для четкого разделения между кодом и контентом.

Таким образом, вы можете написать свой Perl-скрипт для генерации контента и включить любые функции на стороне клиента вШаблон отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...