こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CGI.pmでラジオボタンを思い通り表示できない

<INPUT TYPE="radio" NAME="bread" VALUE="wheat" CHECKED> 小麦パン<BR>
<INPUT TYPE="radio" NAME="bread" VALUE="white"> 白パン<BR>
<INPUT TYPE="radio" NAME="bread" VALUE="rye"> ライ麦パン<BR>

CGI.pmでこれと同じ出力をするにはどうすればよいのですか。

解説サイトなどを見よう見まねで作った私のソースは次のとおりです。
#!/usr/bin/perl
use CGI(-no_xhtml);
my($q) = CGI->new;
print(
$q->header(-charset => "EUC-JP"),
$q->radio_group(-name => "bread", -value => "wheat", -checked), " 小麦パン", $q->br, "\n",
$q->radio_group(-name => "bread", -value => "white"), " 白パン", $q->br, "\n",
$q->radio_group(-name => "bread", -value => "rye"), " ライ麦パン", $q->br
)

これの出力結果は次のとおりです(´д`)
<input type="radio" name="bread" value="wheat" checked="checked" checked>wheat 小麦パン<br>
<input type="radio" name="bread" value="white" checked="checked">white 白パン<br>
<input type="radio" name="bread" value="rye" checked="checked">rye ライ麦パン<br>

近づいてきてはいるのですが、全部のラジオボタンにchecked="checked"が付いてしまっています(´д`)
あと、valueで指定した文字列がタグの外に出てきてしまっています(´д`)

投稿日時 - 2008-11-17 00:42:21

QNo.4484706

暇なときに回答ください

質問者が選んだベストアンサー

「CGI プログラミング 第2版」の 127 ページに書かれていますが、radio_group の場合は
1つのメソッドですべて指定するのではないかと思います。

$q->radio_group(-name => "bread",
-values => ["wheat", "white", "rye"],
-default => "wheat",
-labels => { wheat => "小麦パン", white => "白パン", rye => "ライ麦パン" });

投稿日時 - 2008-11-17 19:57:10

補足

kumozさん、ご報告します。
なんとCGIプログラミングの本を、あと1ページめくったところに私の欲していた情報が載っていたとは・・・。
という訳でCGI.pmを使って質問のHTMLを出力できました。
ただ、私の環境ではCHECKEDの部分がchecked="checked"となってしまい、くどいので、これも何とかしたいです。。。

そして、なんと早くも次の問題にぶつかってしまいました。

次のように、表の中にラジオボタンを入れたいのですが、うまくいきません。
<TABLE>
<TR><TD><INPUT TYPE="radio" NAME="try" VALUE="1">a</TD><TD>あいうえお</TD></TR>
<TR><TD><INPUT TYPE="radio" NAME="try" VALUE="2">k</TD><TD>かきくけこ</TD></TR>
</TABLE>

頑張って作ったパールコードはこんな感じです。
#!/usr/bin/perl
use CGI(-no_xhtml);
my($q) = CGI->new;
print(
$q->header(-charset => "EUC-JP"),
$q->table(
$q->Tr([
$q->td([$q->radio_group({-name => "try", -value => "1", -default => "" -label => "a"}), "あいうえお"]),
$q->td([$q->radio_group({-name => "try", -value => "2", -default => "" -label => "k"}), "かきくけこ"])
])
)
)

これの出力は次のとおりです。
<table>
<tr><td><input type="radio" name="try" value="1" a>1</td> <td>あいうえお</td></tr>
<tr><td><input type="radio" name="try" value="2" k>2</td> <td>かきくけこ</td></tr>
</table>
タグの外に出したいaとkが中に入り、VALUEに指定した1と2が外に出てしまっているという状況です。
またcheckedをどこにも入れたくない場合は
-default => ""
と書くことで実現できましたが、これも、もうちょっとカッコイイ書き方があるような気がします。。。

よろしければ教えてもらえないでしょうか。。。

投稿日時 - 2008-11-22 02:05:41

お礼

kumozさん、ご回答感謝です!
今私は、出張へ飛ばされ中ですので、
ご回答に対する試行と報告は、週末まで待ってください。
CGIは仕事とは何の関係もなく、私がプライベートでやっております^^
自宅へ帰らないとPerlの環境がないのです^^

投稿日時 - 2008-11-17 22:16:09

ANo.1

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> $q->td([$q->radio_group({-name => "try", -value => "1", -default => "" -label => "a"}), "あいうえお"]),
> $q->td([$q->radio_group({-name => "try", -value => "2", -default => "" -label => "k"}), "かきくけこ"])

上記の書き方では、別のラジオグループに属しているものと解釈されて、適切な出力が得られないと思います。
radio_group の戻り値は配列に入れることができるので、それを編集加工して埋め込むという方法があります。

my @radio = $q->radio_group( -name => "try", -values => ["1", "2"],
-default => "-", -labels => { 1 => "a", 2 => "k" } );

print(
.....
$q->td([$radio[0], "あいうえお"]),
$q->td([$radio[1], "かきくけこ"])
.....
);

投稿日時 - 2008-11-22 07:42:20

補足

kumozさん、ご返信感謝です!
教えていただいた方法で、データベースから取得した情報をラジオボタン付きの一覧表にするコードを書きました。
#!/usr/bin/perl
use DBI;
use CGI(-no_xhtml);
my($dbh) = DBI->connect("DBI:mysql:test");
my($sth) = $dbh->prepare("SELECT id, name, pow, hit FROM arm");
$sth->execute;
my($q) = CGI->new;
my(@arm);
push(@arm, [@_]) while(@_ = $sth->fetchrow_array);
my(@radio) = $q->radio_group(-name => "arm", -values => [$arm[0][0], $arm[1][0], $arm[2][0], $arm[3][0]], -default => 0, -labels => {
$arm[0][0] => $arm[0][1],
$arm[1][0] => $arm[1][1],
$arm[2][0] => $arm[2][1],
$arm[3][0] => $arm[3][1]
});
print($q->header(-charset => "EUC-JP"), $q->table($q->Tr([
$q->td([$radio[0], $arm[0][2], $arm[0][3]]),
$q->td([$radio[1], $arm[1][2], $arm[1][3]]),
$q->td([$radio[2], $arm[2][2], $arm[2][3]]),
$q->td([$radio[3], $arm[3][2], $arm[3][3]])
])));
$dbh->disconnect;

これの出力はこんな感じです。
<table>
<tr><td><input type="radio" name="arm" value="1">剣</td> <td>6</td> <td>90</td></tr>
<tr><td><input type="radio" name="arm" value="2">槍</td> <td>10</td> <td>80</td></tr>
<tr><td><input type="radio" name="arm" value="3">斧</td> <td>12</td> <td>70</td></tr>
<tr><td><input type="radio" name="arm" value="4">弓</td> <td>8</td> <td>60</td></tr>
</table>

これを改造して、データベースから取得した情報を@armへ記憶せず、1行ごとに順次出力させるパールコードを思考しています。
#!/usr/bin/perl
use DBI;
use CGI(-no_xhtml);
my($dbh) = DBI->connect("DBI:mysql:test");
my($sth) = $dbh->prepare("SELECT id, name, pow, hit FROM arm");
$sth->execute;
my($q) = CGI->new;
print($q->header(-charset => "EUC-JP"), $q->start_table);
print($q->Tr($q->td(['<INPUT type="radio" name="arm" value="' . $_[0] . '">' . $_[1], $_[2], $_[3]]))) while(@_ = $sth->fetchrow_array);
print($q->end_table);
$dbh->disconnect;

ご覧のとおりCGI.pmを使わず、直接ラジオボタンのタグを書けば、上のHTMLとほぼ同一な結果が得られます。
しかしCGI.pmを使う以上、全てのタグをCGI.pmから出したいという思いがあります。
kumozさん、何度も恐縮ですが、この私の要望に対する解決策をご存知なら、教えてくださいm(__)m

投稿日時 - 2008-11-22 15:16:47

あなたにオススメの質問