CakePHP 2.x の saveAll パススルー メソッドを使用して、1 つのフォームから 3 つの異なるモデル データを保存するシナリオがあります。
フォーム上のモデルは次のとおりです。
- 計画
- プロジェクト画像
- プロジェクトの添付ファイル
1 と 2 は完全に保存されていますが、ProjectAttachment フィールドに問題があります。次の画像を見ると、問題のフィールドは右下にあり、赤い枠で強調表示されています。
状況は次のとおりです。
次のようにフィールドに名前を付けました: *ProjectAttachment.0.project_id*、ProjectAttachment.0.name .... *ProjectAttachment.6.project_id* など、数値はユーザーが追加した添付ファイルの既存の量に関連しています。限りがないので。したがって、ユーザーがすでに 6 つのドキュメントを追加している場合、フィールドはProjectAttachment.7.idなどと呼ばれます。これは、saveAll メソッドを使用するときの命名規則によるものです。
2 つの非表示フィールドを使用しました。1 つはユーザー ID を格納するため、もう 1 つはプロジェクト ID を格納するためです。
問題は、ユーザーがドキュメント タイトルを入力せず、アップロードするファイルを選択しないと、フォームが失敗することです。すべての検証ルールを削除すると、フォームは失敗しなくなりますが、空の ProjectAttachment レコードが挿入されます。
project_id フィールドと user_id フィールド (非表示) に既に値が含まれていることも問題ではないでしょうか?
少し考えて、簡単なコンセプトを思いつきました。コントローラーで、saveAll 呼び出しの前に、空白のドキュメント タイトル フィールドが送信されたかどうかを確認し、送信された場合は、関連する配列エントリをから完全に削除します。$this->request->data['ProjectAttachment']配列ですが、これは機能していないようです。
明確にするために、私は検証ルールを探していません。ユーザーが画像のみをアップロードし、ProjectAttachment フォームには触れないことにした場合、saveAll 操作は失敗してはならず、可能な場合は、フォーム内の空白フィールドを保存しようとしないでください。
助言がありますか?
敬具、サイモン