foldrr's weblog

旧ブログ http://d.hatena.ne.jp/foldrr/

CakePHP 複数レコードの更新画面はかなり面倒

環境

問題

バリデーション エラーで自分自身の画面を再表示する際、非入力項目の内容の扱いが面倒。
以下、初期表示時のデータ取得処理。

<?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 する。