#1 です。
あまり、綺麗なソースではありませんが。。。
entry.cgi
entry.thtml
ranking.thml
の3ファイルで1セットです。このファイルは全て、【日本語EUC】で保存する。と言う事を前提にしています。
entry.thtml, ranking.thtml の拡張子が変わっていますが、書き間違えではありません。必ず「.thtml」と指定してください。
HTML部分を、CGIから分離するために、HTML::Templateと言うモジュールを利用しています。このモジュールが無いため動作しない。と言う事は無いとは思いますが、必要であればサーバーの管理者に問い合わせてください。
インターフェースは、かなり手抜きです。
1. 起動すると、今週の日曜日の日付と、入力欄が表示されます。
2. 日付を指定して、データを打ち込み、「登録」をクリックすると、データが書き込まれます。(入力欄のチェックなどは、まったく行っていません。)
3. 日付を指定して、「読込」をクリックすると指定された日付のデータを読み込みます。修正して「登録」をクリックすると、データが更新されます。(日付が指定されていない。指定された日付のデータが存在しない場合には、エラーが表示されます。)
4. 「生成」をクリックすると、静的HTMLファイルが生成されます。(ファイル名は、$conf{'htmlfile'}の定義で決まっています。各ファイルへの自動リンク機能などはありません。)
5. 「リロード」は、エラーが表示された時、初期表示に戻すために用意してあります。
カスタマイズ
entry.thtml, ranking.thtml は、基本的にHTMLの文法で書かれています。ですので、このファイルを修正して頂ければ、サイトのイメージに合う体裁を作る事ができます。
途中、<TMPL_VAR NAME=なんとか>, <TMPL_LOOP NAME=なんとか>と言う文字列がでてきますが、HTML::Template の機能により、CGI側から埋め込んでいるデータなので、この部分は修正しないでください。(周りのHTMLは自由に修正して大丈夫です。)
生成されるHTMLファイルのファイル名は、$conf{'htmlfile'}で指定しています。%y, %m, %dがそれぞれ、from日付の年, 月, 日に対応して埋め込まれます。
データが数週分存在すると、生成されるHTMLファイルも複数になります。
$conf{'keywords'}, $conf{'description'}, $conf{'pagename'} は、HTMLの<head>~</head>に埋め込む、キーワード, 概要, ページタイトルです。適当に埋め込んでください。
$max の値を変更すると、ランキング数が変わります。
その他機能については、ご自分で修正, 追加して頂くか、ご要望を頂けば修正しますが、来月(明日)より、年末まで少し忙しくなる予定なので、レスポンスが極端に遅くなる可能性があります。(例えば、週末だけ。とか。)ご了承下さい。
----- ^^^ entry.cgi ^^^ -----
#!/usr/local/bin/perl
use HTML::Template;
use Jcode;
use CGI;
use strict;
my($max, $datafile);
my($cgi, %in);
my($i, @rdata, %conf);
$max = 10;
$datafile = 'ranking.txt';
$conf{'keywords'} = '';
$conf{'description'} = '';
$conf{'pagename'} = '';
$conf{'htmlfile'} = 'ranking%y%m%d.html';
$cgi = new CGI;
$in{'smode'} = $cgi->param('smode');
$in{'yy'} = $cgi->param('yy');
$in{'mm'} = $cgi->param('mm');
$in{'dd'} = $cgi->param('dd');
for ($i = 0; $i < $max; $i++) {
$in{"item$i"} = $cgi->param("item$i");
$in{"itemurl$i"} = $cgi->param("itemurl$i");
$in{"maker$i"} = $cgi->param("maker$i");
$in{"value$i"} = $cgi->param("value$i");
}
&readdatafile(\@rdata);
if ($in{'smode'} eq '読込') {
&dispday(\@rdata);
}
elsif ($in{'smode'} eq '登録') {
&updatedatafile(\@rdata);
&disp();
}
elsif ($in{'smode'} eq '生成') {
&makehtml(\@rdata);
&disp();
}
else {
&disp();
}
exit(0);
sub disp {
my($i, @entry_loop, $template);
my($yy, $mm, $dd, $week);
my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$template = HTML::Template->new(filename => 'entry.thtml');
($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6];
$yy += 1900;
$mm++;
if ($week != 0) {
if (($yy % 4) == 0) {
$mmax[1] = 29;
if (($yy % 100) == 0) {
$mmax[1] = 28;
if (($yy % 400) == 0) {
$mmax[1] = 29;
}
}
}
$dd -= $week;
if ($dd < 0) {
$mm--;
if ($mm == 0) {
$yy--;
$mm = 12;
}
$dd += $mmax[$mm-1];
}
}
$template->param(YY => $yy);
$template->param(MM => $mm);
$template->param(DD => $dd);
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="40">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub dispday {
my($rdata) = @_;
my($i, $ymd, @d, @entry_loop, $template);
$template = HTML::Template->new(filename => 'entry.thtml');
if (($in{'yy'} eq '') ||
($in{'mm'} eq '') ||
($in{'dd'} eq '')) {
$template->param(ERROR => '日付が入力されていません。');
}
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
if ($rdata[$i]->{'from'} eq $ymd) {
$d[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
}
if (scalar(@d) == 0) {
$template->param(ERROR => '指定された日付のデータはありません。');
}
else {
$template->param(YY => $in{'yy'});
$template->param(MM => $in{'mm'});
$template->param(DD => $in{'dd'});
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="40" |
. qq|value="|. $d[$i]->{'item'}. qq|">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80" |
. qq|value="|. $d[$i]->{'itemurl'}. qq|">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" |
. qq|value="|. $d[$i]->{'maker'}. qq|">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7" |
. qq|value="|. $d[$i]->{'value'}. qq|">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
}
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub makehtml($) {
my($rdata) = @_;
my($i, %d, $day);
my($yy, $mm, $dd);
my($template, $htmlfile, @fd, @td, @entry_loop);
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
$d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
foreach $day (sort keys %d) {
(@fd) = split(m|/|, $d{$day}[0]->{'from'});
(@td) = split(m|/|, $d{$day}[0]->{'to'});
$htmlfile = $conf{'htmlfile'};
$yy = sprintf("%04d", $fd[0]);
$mm = sprintf("%02d", $fd[1]);
$dd = sprintf("%02d", $fd[2]);
$htmlfile =~ s/%y/$yy/g;
$htmlfile =~ s/%m/$mm/g;
$htmlfile =~ s/%d/$dd/g;
$template = HTML::Template->new(filename => 'ranking.thtml');
$template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd));
$template->param(TODAY => sprintf("%4d年%2d月%2d日", @td));
@entry_loop = ();
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'item'}. qq|">|
. $d{$day}[$i]->{'item'}
. qq|</a>|;
$row{'MAKER'} = $d{$day}[$i]->{'maker'};
$row{'VALUE'} = $d{$day}[$i]->{'value'};
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile");
print HTML $template->output(). "\n";
close(HTML);
}
}
sub readdatafile($) {
my($rdata) = @_;
my($from, $rank, $item, $itemurl, $maker, $value);
if (-f $datafile) {
open(IN, $datafile) || die("Panic! open error $datafile");
while(<IN>) {
chop;
($from, $rank, $item, $itemurl, $maker, $value) = split(m/<>/);
my(%d);
$d{'from'} = $from;
$d{'to'} = &add7day($from);
$d{'rank'} = $rank;
$d{'item'} = $item;
$d{'itemurl'} = $itemurl;
$d{'maker'} = $maker;
$d{'value'} = $value;
push(@{$rdata}, \%d);
}
close(IN);
}
}
sub updatedatafile($) {
my($rdata) = @_;
my($ymd, $i, @work, $line);
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) {
if ($rdata[$i]->{'from'} ne $ymd) {
push(@work, $rdata[$i]);
}
}
for ($i = 0; $i < $max; $i++) {
my(%d);
$d{'from'} = $ymd;
$d{'rank'} = $i+1;
$d{'item'} = $in{"item$i"};
$d{'itemurl'} = $in{"itemurl$i"};
$d{'maker'} = $in{"maker$i"};
$d{'value'} = $in{"value$i"};
push(@work, \%d);
}
@work = sort sortsub @work;
open(OUT, "> $datafile") || die("Panic! open error $datafile");
for ($i = 0; $i <= scalar(@work)-1; $i++) {
$line = join('<>', $work[$i]->{'from'}
, $work[$i]->{'rank'}
, $work[$i]->{'item'}
, $work[$i]->{'itemurl'}
, $work[$i]->{'maker'}
, $work[$i]->{'value'});
print OUT $line. "\n";
}
close(OUT);
}
sub sortsub {
$a->{'from'} cmp $b->{'from'} ||
$a->{'rank'} <=> $b->{'rank'};
}
sub add7day($) {
my($day) = @_;
my($y, $m, $d);
my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if (($y % 4) == 0) {
$max[1] = 29;
if (($y % 100) == 0) {
$max[1] = 28;
if (($y % 400) == 0) {
$max[1] = 29;
}
}
}
($y, $m, $d) = split(m|/|, $day);
$d += 7;
if ($max[$m-1] < $d) {
$d -= $max[$m-1];
$m++;
if ($m == 12) {
$m = 0;
$y++;
}
}
$day = join('/', $y, $m, $d);
($day);
}
----- $$$ entry.cgi $$$ -----
----- ^^^ entry.thtml ^^^ -----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">">
<meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">">
<title><TMPL_VAR NAME="PAGENAME"></title>
</head>
<body>
<div align="left">
<form action="entry.cgi" method="post">
<font color="#ff0000">
<TMPL_VAR NAME=ERROR>
</font>
<p align="left">
<input type="text" name="yy" size="4" value="<TMPL_VAR NAME=YY>">年
<input type="text" name="mm" size="2" value="<TMPL_VAR NAME=MM>">月
<input type="text" name="dd" size="2" value="<TMPL_VAR NAME=DD>">日
</p>
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">商品URL</th>
<th align="center">メーカー</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=ITEMURL></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="left"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
<p align="center">
<input type="submit" value="読込" name="smode">
<input type="submit" value="登録" name="smode">
<input type="submit" value="生成" name="smode">
<input type="submit" value="リロード" name="smode">
</p>
</div>
</form>
</body>
</html>
----- $$$ entry.thtml $$$ -----
----- ^^^ ranking.thtml ^^^ -----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">">
<meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">">
<title><TMPL_VAR NAME="PAGENAME"></title>
</head>
<body>
<p align="center">
<TMPL_VAR NAME=FROMDAY>~<TMPL_VAR NAME=TODAY>のランキング
</p>
<div align="center">
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">メーカー</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="right"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
</div>
</body>
</html>
----- $$$ ranking.thtml $$$ -----
補足
度々のご返信ありがとうございました まさか作成してもらえるとは思いませんでした… 設置したのですが500のエラーが発生してしまい、perlチェッカーで調べてみた所、、どうもHTML::Templateモジュールがないようでした 専用サーバーの為、インストールするには自分でおこなわなければならない事と、telnetでsuでのログインするには実家から接続しなければならない事ですぐに対応ができません… サーバー管理会社に、事務所から接続するホスト名を伝えればなんとかなるので、さきほど事務所から作業できるように手配しました なんとか、HTML::Templateモジュールのインストールをがんばってみます。 また、ご報告させて頂きます。 本当にありがとうございました。