CakePHP 複数レコードの更新画面はかなり面倒
環境
- CakePHP 1.2.3.8166
問題
バリデーション エラーで自分自身の画面を再表示する際、非入力項目の内容の扱いが面倒。
以下、初期表示時のデータ取得処理。
<?php $products = $this->Product->find('all'); $this->data = $products; ?>
初期表示後、ユーザーがフォームを POST する。
POST データをとして渡ってくるのは入力要素として明記した値だけ。
そのため、表示のみを目的としていた値は捨てられてしまう。
仕方がないので、初期表示時以外でも find する。
<?php $products = $this->Product->find('all'); $this->set('products', $products); ?>
ところが、$this->data と $products との間でレコード数が一致しない可能性が出てくる。
解決方法
仕様によって対応が解決方法が異なる。
データベースの内容によって画面項目を非表示にしたい場合は、$this->data を $products でフィルタリングする。
データベースにレコードが存在していなくても画面項目を表示したい場合は、save の前に exists で存在チェックして、存在するもののみ save する。