CGI-BBS > CGI > Perl > Perlについて次のページ前のページボタンを付け加えたい。


カレッヂ
カレッヂ


質問者 ぽてと  投稿日 2004/1/22(木) 00:59:13
こんばんわ。ぽてとと申します。
現在作っているCGIで行き詰ってしまいました・・・。
よろしかったらご教授おねがいいたします。
内容は以下のことなのですが

///////////////////////////////////////////////////////////////////////////////////////////////
$mface = "500";
$k=0;
   while($k<$mface){
	$face_icon[$k]="<img src=\"./IMAGE/face/$k.jpg\" width=100 height=100>";
	$k++;
	next;
}
///////////////////////////////////////////////////////////////////////////////////////////////

上記を条件にして
以下を表示するようにしたいのですが、
///////////////////////////////////////////////////////////////////////////////////////////////
$i=0;
while(@face_icon>$i){
print"<tr align=center>\n" if(@face_icon>$i);
print"<td nowrap>\n",$face_icon[$i],"</td>\n" if(@face_icon>$i);
print"<td nowrap>\n",$face_icon[$i+1],"</td>\n" if(@face_icon>$i+1);
print"<td nowrap>\n",$face_icon[$i+2],"</td>\n" if(@face_icon>$i+2);
print"<td nowrap>\n",$face_icon[$i+3],"</td>\n" if(@face_icon>$i+3);
print"<td nowrap>\n",$face_icon[$i+4],"</td>\n" if(@face_icon>$i+4);
print"</tr>" if(@face_icon>$i);

print"<tr align=center>" if(@face_icon>$i);

$checked[$i]='checked' if($face==$i);
$checked[$i+1]='checked' if($face==$i+1);
$checked[$i+2]='checked' if($face==$i+2);
$checked[$i+3]='checked' if($face==$i+3);
$checked[$i+4]='checked' if($face==$i+4);

print('<td nowrap><input type="radio" ',$checked[$i],' name="face" value="',$i,'">(',$i,')</td>') if(@face_icon>$i && $i==0);
print('<td nowrap><input type="radio" ',$checked[$i],' name="face" value="',$i,'">(',$i,')</td>') if(@face_icon>$i && $i!=0);
print('<td nowrap><input type="radio" ',$checked[$i+1],' name="face" value="',$i+1,'">(',$i+1,')</td>') if(@face_icon>$i+1);
print('<td nowrap><input type="radio" ',$checked[$i+2],' name="face" value="',$i+2,'">(',$i+2,')</td>') if(@face_icon>$i+2);
print('<td nowrap><input type="radio" ',$checked[$i+3],' name="face" value="',$i+3,'">(',$i+3,')</td>') if(@face_icon>$i+3);
print('<td nowrap><input type="radio" ',$checked[$i+4],' name="face" value="',$i+4,'">(',$i+4,')</td>') if(@face_icon>$i+4);
print('</tr>') if(@face_icon>$i);
}continue{
	$i+=5;
}
///////////////////////////////////////////////////////////////////////////////////////////////

この状況ですと、$mface="500";より、jpgイメージとラジオボタンを表示したもの、
500個が一ページに出てきてしまって、処理に時間もかかり、あまり、見栄えのようものになりません・・。
そこで、これを100個位の間の数を1ページとして次のページでも100個という形で
表示できるようにしたいのです。
いろいろ条件を付け加えたりして試してみたのですがどうしてもうまくできませんでした。

どうか皆さんのアドバイスをいただけるとうれしいです。
どうぞ、よろしくお願いします。m(_ _)m

プロバイダ参照:ゥPC
サーバのOS:WINサーバ
パソコンのOS:WinNT系
エディタ:TeraPad
FTPソフト:自PC使用のためしようしていない。
サーバ移転:していない
改造:している
CGI習熟度:middle

回答者 しゅんじ  [削除]  投稿日 2004/1/22(木) 10:51:43
ども、元ソースを参考にして、ちょっと作ってみました。

use strict;

    my $maxNum   = "500";
    my $pauseNum = "100";
    my $startNum = (FORM{'PAGE'})? FORM{'PAGE'} : 0;

    print qq|<TABLE>\n|;
    for (my $i=$startNum; $i<($startNum + $pauseNum); $i=$i+5) {
        last if($i>$maxNum);

        print qq|<TR ALIGN="CENTER">\n|;
          for (my $j=$i; $j<($i + 5); $j++) {
              print qq|<TD NOWRAP>\n|;
              print qq|  <IMG SRC="./IMAGE/face/$j.jpg" WIDTH="100" HEIGHT="100">\n|;
              print qq|</TD>\n|;
          }
        print qq|</TR>\n|;

        print qq|<TR ALIGN="CENTER">\n|;
          for (my $j=$i; $j<($i + 5); $j++) {
              print qq|<TD NOWRAP>\n|;
              print qq|  <INPUT TYPE="radio" NAME="face" VALUE="$j">$j\n|;
              print qq|</TD>\n|;
          }
        print qq|</TR>\n|;
    }

    print qq|<TR ALIGN="CENTER">\n|;
    print qq|<TD NOWRAP>\n|;
      unless ($startNum == 0) {
          my $before = $startNum - $pauseNum;
          print qq|<A HREF="./hoge.cgi?PAGE=$before">戻る</A>\n|;
      }
    print qq|</TD>\n|;
    print qq|<TD NOWRAP>\n|;
      if ($maxNum > $startNum) {
          my $next = $startNum + $pauseNum;
          print qq|<A HREF="./hoge.cgi?PAGE=$next">次へ</A>\n|;
      }
    print qq|</TD></TR></TABLE>\n|;
exit;


最初に画像の最大値と区切り値を決めておきます。
その次がミソなんですが、GETメソッドで送られてきた数値を$startNumに格納しています。
この辺りの[GET/POST]取得方法はそっちであわせてください。

その後表示処理が進んで、[次へ/戻る]を表示する処理になります。
<A HREF="./hoge.cgi?PAGE=$next">
このように、直接リンクに数値を書き込んで送ると、次表示される時に、
書き込んだ数値から始まるという事です。
最初に書いてある「FORM{'PAGE'}」に$nextの数値が格納されると思ってください。

はずしてたら、すんません。
質問者 ぽてと  [削除]  投稿日 2004/1/22(木) 13:42:32
しゅんじさん、アドバイスありがとうございます。
今、付け加えてやっていたのですが、
これは、僕が上記で記述したソースを消して付け加えるという形でいいのですか?
それと
my $startNum = (FORM{'PAGE'})? FORM{'PAGE'} : 0;
のmethodの設定なのですが、どこにmethodを付け加えればいいのでしょうか?

質問ばかりですいません、、
こういった形のを扱うのは初めてなので
よくわからなくて・・・

よろしかったらアドバイスお願いいたします。
回答者 しゅんじ  [削除]  投稿日 2004/1/26(月) 08:27:40
テーブルの書き方とかは、そんなに変えていないので、
そのまま張り替えても表示はされると思います。
ただ[use strict;]と[my]で修飾しています。元ソースを見る限り
全部グローバルみたいなので、[use strict;]は消しといてください。

メッソドの質問ですが、[次へ/戻る]のリンク先に[PAFE=*****]を含ませて
GETで取得しています。
ですから、最初のほうで。[my $startNum = (FORM{'PAGE'})? FORM{'PAGE'} : 0;]
を読み込んでも大丈夫と思います。
読んだ値を変数に入れてるだけなので、まあ場所はどこでもいい気がします。

返信(回答)する

 


Web裏技