テンプレートを用意しておき、必要な項目などをフォームなどに記入するとhtmlを自動生成するというCGIなどはあるでしょうか?よくあるオークションページの自動生成サービスなどは不可で、CGIなどのプログラムを自分のサーバ上で稼働させる手法を求めています。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/11/27 21:45:01
  • 終了:--

回答(3件)

id:Spawapawa No.1

Spawapawa回答回数54ベストアンサー獲得回数02004/11/27 22:38:26

ポイント20pt

http://perl.misty.ne.jp/

Perl・CGI無料講座-ミスティーネット−MISTY-NET −

「大体こんな感じかな」というソースを書いてみました。サーバーで稼動するかどうかわからないのですが参考にしてみてください。アルゴリズム的にはこんな感じかなと思います。勘違いな回答でしたらすみません。

CGIにアクセスするページのソース

<html>

<head>

<title>CGIアクセスページ</title>

</head>

<body>

<div align=”center”>

入力フォーム

</div>

<div align=”center”>

<form action=”made.cgi” method=”post”>

名前:<input type=”text” name=”NAME”>

年齢:<input type=”text” name=”AGE” maxlength=”2”>

性別:<input checked type=”radio” name=”SEX” value=”MAN”>男

<input checked type=”radio” name=”SEX” value=”WOMAN”>女

職業:<select name=”JOB” size=”1”>

<option value=”KAISYAIN” selected>会社員</option>

<option value=”KOUMUIN”>公務員</option>

<option value=”JIEIGYOU”>自営業</option>

</select>

<input type=”submit” name=”SUBMIT” value=”送信”>

<input type=”reset” name=”RESET” value=”リセット”>

</form>

</div>

</body>

</html>

CGIのソース(755で動作)

#!/usr/bin/perl

# もし、ファイル名が指定されなかったらこの名前を使う。

$file_name = ’***.txt’;

# もし、HTMLのタイトルが指定されなかったらこの名前を使う。

$html_title = ’Sample’;

# データの受け取り

if ($ENV{’REQUEST_METHOD’} eq ”POST”) {

read(STDIN, $buffer, $ENV{’CONTENT_LENGTH’});

} else {

$buffer = $ENV{’QUERY_STRING’};

}

@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {

($name, $value) = split(/=/, $pair);

$value =~ tr/+/ /;

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;

$FORM{$name} = $value;

}

# データ作成

$hedaer = ’<html>¥n<heda>¥n<title>’.$html_title.’</title>¥n</heda>¥n<body>¥n’;

$footer = ’<body>¥n<html>¥n’;

$body[0] = ”名前:$FORM{’NAME’}”;

$body[1] = ”年齢:$FORM{’AGE’}”;

$body[2] = ”性別:$FORM{’SEX’}”;

$body[3] = ”職業:$FORM{’JOB’}”;

@data = ($hedaer,@body,$footer);

# ファイル作成

open DATA ”>$file_name.txt”;

print DATA @data;

close DATA;

# 成功メッセージ書き出し

print >>END_HTML;

Content-Type: text/html

<html>

<head>

<title>CGI成功</title>

</head>

<body>

処理は正しく実行されました。

</body>

</html>

END_HTML

exit;

id:telme

ソースを書い頂きありがとうございました。ちょっと試してみてコメントしますね。

2004/11/28 00:19:59
id:Spawapawa No.2

Spawapawa回答回数54ベストアンサー獲得回数02004/11/28 14:43:55

ポイント20pt

http://www.aimix.jp/cgi/

beginners CGI  - 初歩から始める初心者向け Perl-CGI 講座 -

すいません。前のプログラムは走らせると3つくらいエラーが出るのと作るファイル名が「.txt」になっていたで修正後のを使ってください。追加機能としてflocおよびmkdirによるファイルロック機能があります。これによってファイルに同時アクセスした場合も内容が壊れにくくなります。、作るHTMLファイル名は「名前の値」+「.html」です。mkdirによるファイルロックをするときはCGIと同じ位置に「lock」というファイルをパーミッション777で作ってください。もちろんポイントは不要です。

修正後

#!/usr/bin/perl

# もし、ファイル名が指定されなかったらこの名前を使う。

$file_name = ’***’;

# もし、HTMLのタイトルが指定されなかったらこの名前を使う。

$html_title = ’Sample’;

# flockは使えるか。(Yes=0 No=1)

$flocks = 1;

#(上で1を選んだ場合のみ)ロックファイル名はどうするか

$locks = ’./lock’;

# データの受け取り

if ($ENV{’REQUEST_METHOD’} eq ”POST”) {

read(STDIN, $buffer, $ENV{’CONTENT_LENGTH’});

} else {

$buffer = $ENV{’QUERY_STRING’};

}

@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {

($name, $value) = split(/=/, $pair);

$value =~ tr/+/ /;

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;

$FORM{$name} = $value;

}

# データ作成

$hedaer = ”<html>¥n<heda>¥n<title>$html_title</title>¥n</heda>¥n<body>¥n”;

$footer = ”<body>¥n<html>¥n”;

$body[0] = ”名前:$FORM{’NAME’}¥n”;

$body[1] = ”年齢:$FORM{’AGE’}¥n”;

$body[2] = ”性別:$FORM{’SEX’}¥n”;

$body[3] = ”職業:$FORM{’JOB’}¥n”;

@data = ($hedaer,@body,$footer);

# ファイル作成

$file_name = $FORM{’NAME’};

$file_names = ”$file_name”.’.html’;

if ($flocks == 0) {

open(DATA, ”> $file_names”);

flock(DATA, LOCK_EX);

print DATA @data;

flock(DATA, LOCK_NB);

close(DATA);

&good();

} elsif ($flocks == 1) {

if (!LockFile(”./lock/lock.lock”, 10)) {

print ”Content-type: text/html¥n¥n”;

print ”<html>¥n<head>¥n<title>CGI失敗</title>¥n</head>¥n<body>¥n”;

print ’LockFileでエラーが起きました。’;

print ”</body>¥n</html>¥n”;

exit(1);

}

open(DATA, ”> $file_names”);

print DATA @data;

close(DATA);

&UnlockFile();

&good();

} else {

print ”Content-type: text/html¥n¥n”;

print ”<html>¥n<head>¥n<title>CGI失敗</title>¥n</head>¥n<body>¥n”;

print ’$flocksの値が不正です。’;

print ”</body>¥n</html>¥n”;

}

# mkdirによるファイルロック

$LOCKFOLDER = ”$locks”;

sub LockFile {

local($lockfolder, $timeout) = @_;

local($i) = 1;

if ($LOCKFOLDER ne ””) {

return(0);

} else {

$LOCKFOLDER = $lockfolder;

}

$SIG{’PIPE’} = $SIG{’INT’} = $SIG{’HUP’} = $SIG{’QUIT’} = $SIG{’TERM’} = ”UnlockFile”;

for (;;) {

if (mkdir($lockfolder, 0755)) {

return(1);

} elsif ($i < $timeout) {

sleep(1);

} else {

$LOCKFOLDER = ””;

return(0);

}

}

}

# mkdirによるファイルロックを解除する

sub UnlockFile {

if ($LOCKFOLDER ne ””) {

rmdir($LOCKFOLDER);

$LOCKFOLDER = ””;

}

}

# 成功メッセージ書き出し

sub good{

print <<END_HTML;

Content-type: text/html

<html>

<head>

<title>CGI成功</title>

</head>

<body>

処理は正しく実行されました。

<a href=”$file_names”>作成したページへ移動</a>

</body>

</html>

END_HTML

}

exit;

id:kuippa No.3

くいっぱ回答回数1030ベストアンサー獲得回数132004/12/01 12:33:18

ポイント20pt

phpになってしまいますが、

Smartyを利用すれば、テンプレートと実行スクリプトを分けて記述することができます。

テンプレートに置き換えたい変数などを組み込んでおいて、PHPでSmartyを通してそのテンプレートを読み込むと、テンプレートが解釈されるというような仕組みです。

掲題のサイトはちょっと見てスグ判る!というようなものでもないようなのですが、検討してみる価値はあると思います。

id:telme

ありがとうございます。kuippaさん。せっかく返答頂いたのに、そのままになって申し訳ありません。参考にさせて頂きます。

Spawapawaさんへ

色々問題がありまして、すぐに確認できる状況ではなくなってしまいました。修正前のCGIはうまく動作しませんでした。もし、Spawapawaさんが見て頂いていたら、お聞きしたいのですが、後日、連絡をとる方法はありますか?

2004/12/03 16:17:45

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません