チェックボックスにチェックがない場合でもデータを送信する
通常、チェックボックスにチェックがない状態でフォームを送信すると、リクエストからはそのチェックボックスの名前すら取得できません。
たとえば次のような HTML でチェックボックスにチェックをしなかった場合、リクエストに含まれるパラメータは user_name=hoge のみとなります。
<form action="some_controller" method="post">
<input type="text" name="user_name" />
<input type="checkbox" name="is_admin" value="0" />
</form>しかしながら PHP スクリプト中でチェックボックスのチェックが外れたかを確認するために…
$is_admin = false; if (in_array("is_admin", $_POST)) { $is_admin = true; }
…と書くのも面倒です。 CakePHP ではこの問題にどう取り組んでいるかと思い、ソースを調べてみました。どうやら CakePHP では、同じ名前の hidden 要素でチェックが外れた場合の value を送信しているようです。
<form action="some_controller" method="post"> <input type="text" name="user_name" /> // チェックが外れた場合はこの値を送る <input type="hidden" name="is_admin" value="0" /> // チェックされた場合は hidden を上書きしてこの値を送る <input type="checkbox" name="is_admin" value="1" /> </form>
HTTP パラメータに同じ名前があった場合は、一番最後のパラメータのみを送るというブラウザの仕様でしょうか。 IE と Firefox では動作しました。