🕌

CakePHPのFormのデフォルト値

2023/06/30に公開

はじめに

Cake\View\Helper\FormHelper::control(string $fieldName, array $options = [])の第二引数$optionsでdefaultを設定してもその設定した値が適応されない場合があったのでどの値が適応されるのか調べてみました。

$this->Form->control('hoge', [
	'default' => true,
    ]);

前提条件

formのcontextがEntittyの場合($this->Form->create()の第一引数にEntityをいれている)で
Postリクエスト前のフォームのデフォルト値に関する話になります。
調査した際のCakePHPのバージョンは4.4です。

調査結果

  • Form->control()の第二引数$optionsでval, value, schemaDefaultが設定されていない場合はdefaultの値が適応される
    • ただしdefaultがnullの場合はデータベースのカラムに設定されたデフォルト値が適応される。
      • データベースのカラムのデフォルト値を適応したくない場合はoptionsでschemaDefalt => falseを設定する
    • CheckboxWidgetを使ったチェックボックスの場合は$optionsのdefaultで設定した値よりcheckedの値が優先される(optionsが'type' => 'select', 'multiple' => 'checkbox'の場合はMultiCheckboxWidgetが使われる)
  • optionsでvalもしくはvalueに値が設定されている場合はdefaultの値より優先されてその値が適応される。
    • val > value > defaultの優先順でデフォルト値が適応される

①例えば下記の様になっていた場合はvalの値が優先される。オプションの順番は関係ない。

$this->Form->control('title', [
    'value' =>  'hoge1',
    'default' => 'hoge2',
    'val' => 'hoge3',
]);

②データベースでデフォルト値に1が設定されている場合でも、ラジオボタンで未選択にしたい場合は下記の様にschemaDefault => falseに設定する。default => nullではなくdefault => ''でもOK

$this->Form->control('is_true', [
    'type' => 'radio',
    'options' => [0 => 'いいえ', 1 => 'はい'],
    'default' => null,
    'schemaDefault' => false,
]);

Discussion