2012-04-17 14 views
0

CakePHP 2.xのsaveAllパススルーメソッドを使用して、3つの異なるモデルデータを保存するシナリオがあります。CakePHP - 特定のフィールドが空白のときsaveManyコールでモデルデータが保存されないようにする

フォーム上

モデルは以下のとおりです。

  1. プロジェクト
  2. ProjectImage
  3. ProjectAttachment

1と2は完全に保存されていますが、ProjectAttachmentフィールドに問題があります。あなたは以下の画像を見れば、問題のフィールドは赤枠で強調表示右下、である:ここでhttp://img.skitch.com/20120417-bnarwihc9mqm1b49cjy2bp13cf.jpg

状況です:

次のように私はフィールドを命名している:* ProjectAttachment .0.project_id *、ProjectAttachment.0.name .... * ProjectAttachment.6.project_id * etcここで、数字は、ユーザーが追加した添付ファイルの現在の量を基準にしたもので、制限はありません。したがって、ユーザーがすでに6つのドキュメントを追加している場合は、フィールドはProjectAttachment.7.idとなります。これは、saveAllメソッドを使用するときの命名規則のためです。

2つの非表示フィールドを使用しました.1つはユーザーIDを格納し、もう1つはプロジェクトIDを格納します。

問題は、ユーザーがドキュメントのタイトルに記入せず、アップロードするファイルを選択しないと、フォームが失敗することです。すべての検証ルールを削除すると、フォームは失敗しなくなりますが、空のProjectAttachmentレコードが挿入されます。

project_idフィールドとuser_idフィールド(隠れている)に既に値が入っている可能性がありますか?

シンプルなコンセプトを思いつきました。私のコントローラでは、saveAllコールの前に、空のドキュメントタイトルフィールドが送信されたかどうかを確認します。 $ this-> request-> data ['ProjectAttachment']配列からの関連する配列エントリですが、これはうまくいかないようです。

明確にするために、私は検証ルールを探していません。ユーザーが画像をアップロードしてProjectAttachmentフォームに触れないようにする場合は、saveAll操作が失敗しないようにする必要があります。空白のフィールドをフォームに保存しないでください。

提案がありますか?

敬具、 サイモン

答えて

0

まあ、それは解決策は、私が最初に思っていたよりもはるかに簡単だったようです!部分的に正しい軌道に乗っていましたが、変数ProjectArrayのキーを$ this-> request-> dataに設定しなければなりませんでした。

次のように私はこれをしなかった:

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']); 
       } 
      } 
     } 
    } 

を、私は、誰かが何らかの形で、これは何とか重宝願っています。

親切に、 Simon

関連する問題