form helperでテキストボックスやラジオボタンなどを作成するときに、"default"オプションを指定することで、そのフォームエレメントに関連する変数に何も値が入っていないときに値を設定することができます。
"value"オプションとの違いは、"value"を指定すると、そのフォームエレメントに関連する変数の値の有無にかかわらず値が強制的に指定されるのに対し、"default"では変数に値があればそちらを、なければデフォルト値を設定してくれる点です。
しかし、変数にデータベースから読み込んだ値が入っていても、そちらを使わずにデフォルト値が使われてしまう場合がありました。例えば、次のように登録済みのユーザデータを編集するフォームで、性別を選択するラジオボタン(0 => '男', 1 => '女' とします)を作成して、フォームを作成し、データベースから性別の値を読み込んだ場合、読み込んだ値が0がだったとすると、($this->data['User']['sex'] = 0)もともと設定されていた値ではなくdefaultで指定した1が選択されてしまいます。
<?php
echo $form->input('User.sex',
array('type' => 'radio', 'default' => 1));
?>
原因を調べた結果、cake/libs/view/helper.phpの594行目でデータベースから取得した値が入っているかどうかをphpのempty()で判断しているため、0や"0"が設定されていた場合でも、値が入っていないとみなされてデフォルト値で上書きされていたことがわかりました。
if (is_array($options)) {
if (empty($result) && isset($options['default'])) {
$result = $options['default'];
}
unset($options['default']);
}
次のようにnullであるかどうかで判断するように変更することで、この問題は修正されました。
if (is_array($options)) {
if (is_null($result) && isset($options['default'])) {
$result = $options['default'];
}
unset($options['default']);
}
頻繁に使う基本的なメソッドのバグなので、私だけでなくきっと多くの人がはまっているのではないでしょうか?





