HTMLのチェックボックスをHTML::FillInFormでチェック付けるときは注意
HTMLのチェックボックスは、チェックがないときは、値を送信しないのですけれども、これじゃ困る場合があります。CGI のセッション側で値を保持していたとき、チェックを外したことがわからないと、セッション側で持っている値を更新のしようがないです。オケーションを把握して、それによってチェックボックスの値が送信されないときは、チェックボックスを off にした、て認識する方法はありますけれども、クエリパラメータの処理を一カ所で行いたかったんです。
そんななか、
フォームのCheckboxの値をオフの場合でも送信するには? [www.tohoho-web.com] ていう 10 年前の情報があって、まとめると、
<input type="checkbox" name="hoge" /> <input type="hidden" name="hoge" value="off" />
とかして、チェックボックスがチェックされていないときでもチェックされていないことを送信するやり方があるんです。
CGI.pm で受け取ると、Dumper([$q->param('hoge')]) は、
チェックボックスon:
$VAR1 = [
'on',
'off'
];
チェックボックスoff:
$VAR1 = [
'off'
];
となるので、
$q->param('hoge', [$q->param('hoge')]->[0]) if $q->param('hoge');
ていうコードを入れれば、フォーム側のチェックボックスの on/off に対応して CGI 側が処理ができる。
~~~
ここまではいいんですけれども、
HTML::FillInForm で HTML 内の hoge チェックボックスを付ける、つまり $q->param('hoge') が 'on' になっている状況で HTML::FillInForm を使い HTML を加工すると、
<input value="on" type="checkbox" name="hoge" /> <input value="on" type="hidden" name="hoge" />
となっちゃう。両方とも同じ名前だから。
Dumper([$q->param('hoge')]) は、
チェックボックスon:
$VAR1 = [
'on',
'on'
];
チェックボックスoff:
$VAR1 = [
'on'
];
となるので、意味がなくなるよ!
数を数える方法にした方がいいみたいですね。
if ( $q->param('hoge') ) {
$#{[$q->param('hoge')]} ? $q->param('hoge', 'on' )
: $q->param('hoge', 'off')
}
ぱっと見、何やっているかわからないので、もっといい方法ないのかなー
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/19018/15185965
この記事へのトラックバック一覧です: HTMLのチェックボックスをHTML::FillInFormでチェック付けるときは注意:

![すぐ解決!DTPトラブル対策ブック―最強最後のOS9(+OSX)ガイド [単行本]](http://ec2.images-amazon.com/images/I/51895BQKEPL._SL500_AA208_.jpg)








