2012-09-26 37 views
2

我正在用Yii構建一次更新兩個模型的表單。
表單將每個模型的輸入視爲$ modelA和$ modelB,然後分別按照此處所述處理它們http://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to-collect-data-for-two-or-more-models/提交後處理表單輸入值導致多個實例

這樣很好。與我的例子不同的是,$ modelA(文檔)必須被保存並且其ID被檢索,然後$ modelB必須被保存,包括$ model A中的ID,因爲它們是相關的。

有一個額外的麻煩,$ modelB有一個需要保存的文件。

我的動作代碼如下:

if(isset($_POST['Documents'], $_POST['DocumentVersions'])) 
    { 
     $modelA->attributes=$_POST['Documents']; 
     $modelB->attributes=$_POST['DocumentVersions']; 


     $valid=$modelA->validate(); 
     $valid=$modelB->validate() && $valid; 


     if($valid) 
     { 

      $modelA->save(false); // don't validate as we validated above. 
      $newdoc = $modelA->primaryKey; // get the ID of the document just created 

      $modelB->document_id = $newdoc;   // set the Document_id of the DocumentVersions to be $newdoc 
      // todo: set the filename to some long hash 

      $modelB->file=CUploadedFile::getInstance($modelB,'file');  
      // finish set filename 
      $modelB->save(false); 

      if($modelB->save()) { 
       $modelB->file->saveAs(Yii::getPathOfAlias('webroot').'/uploads/'.$modelB->file); 
       } 

      $this->redirect(array('projects/myprojects','id'=>$_POST['project_id'])); 
     } 
    } 
    ELSE { 

    $this->render('create',array(
     'modelA'=>$modelA, 
     'modelB'=>$modelB, 
     'parent'=>$id, 
     'userid'=>$userid, 
     'categories'=>$categoriesList 
    )); 
    } 

你可以看到,我推新值「文件」和「DOCUMENT_ID」到$ modelB。這一切工作沒有問題,但是...每次我將這些值中的一個推入$ modelB中,我似乎獲得了$ modelA的新實例。所以最終的結果是,我得到了3個新文檔和1個新版本。新版本全部正確鏈接,但其他兩個文檔只是直接複製。
我已經測試刪除了$ modelB更新步驟,並且確實已經刪除了$ modelA的副本(或者至少是生成的數據庫條目)。
我不知道如何防止這種情況。

UPDATE ....

當我把在下面留言,進一步測試顯示$ MODELA的實例的數量取決於有多少次的表格已經提交。即使在此期間訪問了其他頁面/視圖,如果表單在短時間內重新提交,每次我在數據庫中獲得一個額外的條目。如果這是由於某種形式的持久性,那麼我希望得到PREVIOUS模型的額外副本,而不是當前模型的倍數。所以我懷疑它的儲蓄方式是什麼,就像有一些計數器正在遞增一樣,但我不知道在哪裏尋找它,或者每次如何清零。

一些幫助將不勝感激。 感謝

JMB

+0

我正要發佈相同的問題:)我正在瀏覽yii的問題,看看是否有人發佈了這個:)我有完全相同的問題。在同一個_form.php和模型B中的模型A +模型B表單需要模型A中的ID。我將看看您發佈的鏈接,看看是否可以解決我的問題並幫助解決當前的問題。 – WebDevPT

+1

我希望你從'$ modelB'中保存'$ modelB',然後在if條件中再次執行'$ modelB'中的兩個'$ modelB'實例。但是我不明白你爲什麼會得到這個奇怪的結果('modelA'的3個拷貝到'$ modelB'中的一個??你確定''modelB''中沒有'afterSave'方法! – Nimir

+0

好的,更多的調試顯示......模型B的實例數似乎基於表單提交的數量,如果我一個接一個地添加更多的文檔,我會得到越來越多的$ modelA實例。模型在$ modelA = new Documents和$ modelB = new DocumentVersion的代碼頂部被重置。 –

回答

1

OK,我已經Ajax驗證設置爲true。這是調用創建操作並插入條目。我沒有完全得到這個,或者如果我真的想要沒有這種效果,我可以使用ajax驗證,但是...至少有兩種模型插入關係的作品。

感謝您的意見。 歡呼聲 JMB