2008年 12月 10日(水曜日) 17:27

【CakePHP】フォームのデフォルト値が実際の値を上書してしまうバグ

評価:
(0 票)

現在CakePHP 1.2.0.7692-rc3を使っていますが、フォームのデフォルト値の指定にバグがあるようです。

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

頻繁に使う基本的なメソッドのバグなので、私だけでなくきっと多くの人がはまっているのではないでしょうか?

最終更新日: 2011年 6月 27日(月曜日) 01:38
くらち たかよし

くらち たかよし

モバイル・Webアプリ作家。最近は主にiPhoneアプリ制作を手がける。企画から、UIデザイン、設計、実装、テスト、多言語対応、ユーザーサポートまでを1人〜数人の個人で行う全人的開発手法の確立を目指している。

使う言語はObjective-C, C++, C#, Java, PHPなど。Web関連で使うものはCakePHP, MySQL, Joomla! CMSなど。デザインはシロウトながらPhotoshopとIllustratorをなんとかがんばって使う。

場所や時間に縛られない、インターネット時代の新しい働き方、自由な生き方を模索中。海外移住、低予算&低リスク起業、キャリアデザイン、心理学などにも興味あり。

Web: awaresoft.jp/
このカテゴリの他の記事: « 【CakePHP】CakePHPでYUIを使うには