何かしらの入力画面の中にセレクトボックスがあったとする。
ボタンを押してデータを入力する際、エラーがあれば入力画面に戻ってくるのが一般的だと思うけれど、その際に入力したデータは保持されているのが望ましい。エラーのたびに一から全部入力し直すのはだるいもんね。
それでセレクトボックスなんですけど、cakePHPはちゃんとセレクトボックス用のヘルパーも用意されている。たいしたやつだ。
<?php echo $form->select($fieldName, $options = array(), $selected = null, $attributes = array(), $showEmpty = '') ?>
書き方はこんな感じ。
この第三引数の$selected = nullのところ。ここには初期状態でどれが選択されているかを入力する。何も入力しなければnullになる。
これ、$fieldNameと$optionだけ値を入力する場合には別段気にするところはないのだけど、第5引数にも値を書きたい(たとえばfalseとか)ってときには、何も入力しないというわけにはいかない。そういう場合は自分でnullと書いてやらなければならない。
で、まあ、cakeはだいぶ優秀なやつなので、間違った書き方をしなければ勝手に値を保持してくれるらしいので、エラーが出て入力画面に戻っても基本的にはエラー前に選択した状態が保たれる・・・・・・はずなんですけど、僕が作ったプログラムだと、どうしても値が保持されなかった。
ここで重要になるのが、空文字とnullは違うんだってこと。
正直なところ、僕はこの両者をあまりはっきりと区別はしていなかった。if文で判定するときも、何も値を入力していないのであれば$a == ‘ ‘ だろうと$a == nullだろうとOKじゃんって感じでずっとやってたから、両者は違うものなんだと知識の上では知ってはいても、扱いは一緒じゃんかってずっと思ってた。
でもそういうわけにはいかなかったようで、セレクトメソッドの第3引数のところに空文字を入れておくと、$this->dataに空文字が送られた状態になるので、エラーが生じて入力画面に戻ってきたときも、optionのvalueが空のところが選択状態になってしまう。
これが保持されない原因だったらしい。
$form->select('id', $id,'','', false);
$form->select('id', $id, null, null, false);
この二つは同じようで違うんだということをもっとちゃんと認識しなければいけなかったようですね。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。