M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2007年5月24日 16:20

HTMLのチェックボックスをHTML::FillInFormでチェック付けるときは注意

このエントリーをはてなブックマークに追加 mixiチェック

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')
}

ぱっと見、何やっているかわからないので、もっといい方法ないのかなー

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2084

コメントする