例えばビューで、
foreach ($staffs as $staff) { $this->Form->input('StaffAttendance.'.$staff['id'].'.in'); $this->Form->input('StaffAttendance.'.$staff['id'].'.out'); }
のようなフォームで、スタッフごとの出退勤時間をまとめて設定したいとして、バリデーションエラーを設定したい場合、(多分)StaffAttendanceモデルでバリデーションを設定してもin,outには効かないと思います。*1
このような場合にバリデーションする方法です。
例ではinとoutのemptyを許さないようコントローラでバリデーションエラーを設定します。
foreach ($this->request->data['StaffAttendance'] as $staffId => $values) { if (empty($values['in'])) { $this->StaffAttendance->validationErrors[$staffId]['in']['notEmpty'] = '出勤時間は必ず設定してください'; } if (empty($values['out'])) { $this->StaffAttendance->validationErrors[$staffId]['in']['notEmpty'] = '退勤時間は必ず設定してください'; } }
こんなかんじでモデルのvalidationErrorsに直接代入すれば配列が深くなってもエラーを登録できます。
これを応用して、StaffAttendance.multiple.{$staff[‘id’]}.inとか、まとめて登録する場合のfield名をきめておけば、モデルのbeforeValidateで処理することも可能ですし、saveMultipleメソッドなんかを自作してまとめて登録することもできますね。
- 3次元までならいける書き方があったような気もしますがとりあえずおいておいて、さらに深い次元の配列だと無理だと思います。 [↩]