読者です 読者をやめる 読者になる 読者になる

cakephp1.2 フォームのデフォルト値について

もう忘れたくないのでメモ。
以下のようなテキストボックスがあるとする。

<?php e($form->create('huga')); ?>
<?php e($form->text('hoge')); ?> 

このフォームをpostしてエラーになってもう一度表示した場合、自動で入力した値がセットされる。
次にDBから取得した値をデフォルト値としたい場合どうするか?以下はbadな例($dbはDBから取得した値)

<?php e($form->text('hoge', array('value' => $db['hoge']))); ?> 

これをpostするとvalueの値はあくまで$data['hoge']をセットしようとするため、入力した値がセットされなくなってしまう。
cakephpにはdefaultという属性がある。これだとどうか。

<?php e($form->text('hoge', array('default' => $db['hoge']))); ?> 

これだと初回だけvalueに$db['hoge']をセットしてそれ以降は無視する挙動になる。
これで一見良さそうに見えるが、post後に無駄に$db['hoge']をcontroller側でsetしないとエラーになるためこれもダメ。

ベストプラクティスはcontroller側でデフォルト値をセットすればよい。
controller

<?php
$this->data['huga']['hoge'] = $db['hoge'];

html

<?php e($form->create('huga')); ?>
<?php e($form->text('hoge')); ?> 

formヘルパーのvalueには$this->dataの値がセットされるため、そこに直接デフォルト値を入れてやれば良い。
もちろんpost後は入力した値がセットされるため、$this->dataをいじる必要は無い。
二度と忘れないこと。