家・車以外で、人生で一番奮発した買い物

CGIを改造中です。

フォーム部分なのですが、十数項目あるものをドロップダウンリストで選択してもらうようにしたいです。
新規入力フォームは何も考える必要はないと思うのですが、問題は修正画面です。以前選択したものに「selected」を付ける必要がありますよね。
素人考えでは、
if($cou1 eq "項目1"){$selected1="selected";}
if($cou1 eq "項目2"){$selected1="selected";}
if($cou1 eq "項目3"){$selected1="selected";}
~~
として、
<option value=項目1 $selected1>項目1
<option value=項目2 $selected1>項目2
<option value=項目3 $selected1>項目3
~~
と、えんえん書き続けないといけない方法しか思いつきません。

これをどうにかして簡素に書く方法はないでしょうか?
お願いします。

A 回答 (3件)

効率いいかどうか微妙だけど、こんな風でどうでしょう?



$cou1 = 'bbb';#前回選択値
foreach (['項目1','aaa'],['項目2','bbb'],['項目3','ccc']){
print '<option value="',$_->[1],'"',($cou1 eq $_->[1])?' selected':'','>',$_->[0],"\n";
}
# ↓ 実行結果
<option value="aaa">項目1
<option value="bbb" selected>項目2
<option value="ccc">項目3
    • good
    • 0
この回答へのお礼

すばやい返答ありがとうございます。

無事この方法で設定できました。

ありがとうございました。

お礼日時:2007/06/14 11:07

use CGI;


use HTML::FillInForm;

my $q = new CGI;

# 初期値設定
$q->{"menu"} ||= "項目2";

$html = <<"HTML";
<form action="" method="POST">
<select name="menu">
<option value="項目1">項目1</option>
<option value="項目2">項目2</option>
<option value="項目3">項目3</option>
</select>
<input type="submit" />
</form>
HTML

my $fif = new HTML::FillInForm;
my $output = $fif->fill(scalarref => \$html,
fdat => $q);

print "Content-type: text/html\n\n";
print $output;
    • good
    • 0

ん~、ちょっと面倒なのはこんな感じ。

(データは$cou1に入っていると仮定。)

$sel{"$cou1"}=" selected";#selectedの前にスペースあり。こちらの方が空白+変数よりも、空白表示が綺麗。

<select name="cou1">
<option value="1"$sel{"1"}>項目1</option>
<option value="2"$sel{"2"}>項目2</option>

<option value="同じ"$sel{"同じ"}>項目名</option>
</select>

ハッシュを一つだけ作り、それに該当するキーを持つ変数だけ、selectedを代入します。(その他変数は存在しない。)
データに2が入っているのなら、$sel{"2"}=" selected";が作られ、$sel{"その他"}は存在しない=空白です。
基本的考え方はmaster-3rdさんと同じです。ただ、if文などを使わず、変数を一つしか作らないと言う部分が異なるだけですね。

しかし、こういうのはsteel_grayさんの、<option>をループで自動生成し、その途中で、フォームデータと値が同じならselectedを出力する、と言うのが技術的にも感覚的にも、一番楽かなと思います。ただ、HTMLを固定して出力したいなら、今回のようにハッシュを使うのも手です。

ついでに、<option>は閉じて、値は""で挟む方がいいと思いますよ。区切りがついて分かりやすいですし。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報