最終更新: 2006-06-24 (土) 20:33:32
このページをDeliciousに追加 このページをはてなブックマークに追加 このページをlivedoor クリップに追加 このページをYahoo!ブックマークに追加

Boolean のチェックボックスが必ず値を返すように

問題点

IE6 で実験してみたところ、チェックボックスというのは、

  • チェックされていなければ何も返さない
  • チェックが入っていれば value の値を返す
  • value が設定されていなければ on を返す

という動作をするようだ。 この何も返さないというのが曲者だったりする。

'required' => false に設定した場合

フォーム値が空でも検証を通過してしまう。 後でデータベースへの入力に使おうとした場合に不便。

'required' => true に設定した場合

チェックがされていないと、 「〜を選択して下さい」と再入力を促されてしまう。

'filter' を指定した場合

こんなフィルタを適用しようとしてみた。

function _filter_boolean($value)
{
    return ($value) ? 1 : 0;
}

しかし、そもそも何の値も渡って来ていないので、 フィルタが適用されず、フォーム値は空のまま。

解決策

ということで、 'type' => VAR_TYPE_BOOLEAN なチェックボックスをサーチして、 値を変換するメソッドを、ActionForm クラスに追加してみた。

function filterBooleanCheckbox()
{
    foreach ($this->form as $name => $def) {
        if ($def['type']      == VAR_TYPE_BOOLEAN &&
            $def['form_type'] == FORM_TYPE_CHECKBOX) {
            $this->form_vars[$name] = ($this->form_vars[$name]) ? 1 : 0;
        }
    }
}

このメソッドを $this->af->validate() する前に呼び出せば、

  • チェックされていなければ0
  • チェックが入っていれば1

という値が、チェックボックスのフォームから得られるようになる。


(Counter:1, Today:1, Yesterday:0)
トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   最終更新のRSS