0

CakePHP 2.x の saveAll パススルー メソッドを使用して、1 つのフォームから 3 つの異なるモデル データを保存するシナリオがあります。

フォーム上のモデルは次のとおりです。

  1. 計画
  2. プロジェクト画像
  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 操作は失敗してはならず、可能な場合は、フォーム内の空白フィールドを保存しようとしないでください。

助言がありますか?

敬具、サイモン

4

1 に答える 1

0

解決策は、私が最初に考えていたよりもはるかに簡単だったようです! 私は部分的に正しい方向に進んでおり、空白のフィールドに遭遇した場合は、 $this->request->data配列の変数ProjectArrayキーを設定解除する必要がありました。

私はこれを次のようにしました:

    if(!empty($this->request->data['ProjectAttachment'])){
        foreach($this->request->data['ProjectAttachment'] as $key => $value){
            if(is_array($value) && array_key_exists('upload_file', $value)){
                if($value['upload_file']['name'] == ''){ // Blank document file
                    unset($this->request->data['ProjectAttachment']);
                }
            }
        }
    }

誰かがこれが何らかの形で何らかの形で役立つことを願っています.

敬具、サイモン

于 2012-04-17T09:11:32.407 に答える