2012-10-11 50 views
1

我處於多於4個子表與一個父表關聯的情況。我需要創建一個用戶體驗,用戶只需按一下保存按鈕一次,即用戶在父模型字段中輸入所有數據,然後在所有四個子模型字段中輸入數據,然後按下保存按鈕。據我所知,在模型中建立關係允許您輕鬆插入關聯的行,但主要問題是如何從單個模型的POST方法的視圖中接收多行(這裏我基本上是指子模型)。我已經通過重複視圖中的子模型的屬性手動嘗試了它,但是當我保存記錄時,只有最後一個行集會與父表一起存儲在子表中,因此子表的一行會被忽略。請注意,我在View文件中使用CActiveForm和其他Bootstrap小部件。Yii:在POST方法中從視圖接收單個模型的多個記錄:保存父級子數據

Yii有可能嗎,或者我太想了麼......任何建議或意見????

非常感謝提前。 問候,費薩爾

回答

0

您應該使用tabular input,這樣你可以接收同一類型的multipe實例的數據,你可以再保存父,並使用其ID,以填補孩子外鍵。

+0

感謝Asgaroth您的輸入。我試圖實施它,但面臨一些問題。首先,$ item-> validate()拋出錯誤,儘管$ model-> validate起作用。當我提交表單時,我不會將所有行重新存入模型中,以便迭代以實現所需的功能。不過,我現在正在嘗試Kiran [鏈接] http://www.yiiframework.com/forum/index建議的解決方案。php/topic/36463-receiving-multiple-records-for-a-single-model-from-view-in-post-method-to-save-parent-child-data/page__pid__175562#entry175562 [link]並將回覆與更新。 – FaisalKhan

0

您可以創建一個新的CFormModel來處理所有的表單字段驗證,然後在POST函數中的$ model-> validate之後手動設置屬性。 EG:

if ($model->validate){ 
    $model_one = new ModelOne; 
    $model_one->name = $model->model_one_name; 
    $model_one->surname = $model->model_one_surname; 
    .... 

    $model_two = new ModelTwo; 
    $model_two->name = $model->model_two_name; 
    $model_two->surname = $model->model_two_surname; 
    .... 
} 
+0

謝謝愛斯基摩人。我喜歡你所建議的方法,一定會使用它。然而,目前,我在POST中接收多行模型的問題仍然存在,我在本文中通過Kiran提出了一個建議[link] http://www.yiiframework.com/forum/ index.php/topic/36463-receiving-multiple-records-for-a-single-model-from-view-in-post-method-to-save-parent-child-data/page__pid__175562#entry175562 [link]。讓我嘗試通過在HTML中動態生成模型屬性並查看POST如何將它們全部發送回控制器... – FaisalKhan

+0

沒問題:)因此,您希望在一個POST中接收同一模型(動態數量)的多個記錄?如果是這樣的話,您應該能夠以數組的形式訪問所有POST數據,並使用foreach()循環記錄,並在每個循環中根據模型驗證POST屬性。希望你過得對! –

2

我得到的解決方案,但從這裏和其他論壇的所有幫助。我遵循Kiran的post,並通過使用jQuery生成其他HTML屬性來測試它。在提交中,我得到了我想要的所有行。在控制器中,首先我計算了在發佈請求中提交的模型總數,然後對每個模型進行迭代以獲得期望的處理。以下是代碼片段。

if(!empty($_POST)) 
{ 
    $v=count($_POST['Address'])+1; 
    Yii::log(count($_POST['Address'])); 
    for ($i=1; $i<$v; $i++){ 
      $addressModel_1->attributes=$_POST['Address'][$i]; 
      Yii::log('Dumping Data from '.$i.' model'); 
      Yii::log($addressModel_1->city); 
      Yii::log($addressModel_1->street); 
      Yii::log($addressModel_1->state);}} 

在視圖方面,我使用jQuery函數生成了HTML。所有這些功能都是添加另一組html來允許用戶輸入數據。生成HTML時需要注意的重要事項是模型的名稱,否則它不會落在控制器所需的位置。

以下是此功能的代碼片段。請注意,由於我已經在DOM中有兩組行,因此我將「3」硬編碼爲id。我將進一步改進此代碼,但請放心,該邏輯起作用。

function createNewAddress(){ 
    var newdiv = document.createElement('div'); 
    var inner_html='<div class="row">'; 
     inner_html+='<label for="Address_3_street">Street</label>  <input name="Address[3][street]" id="Address_3_street" type="text" maxlength="200" />   </div>'; 
     inner_html+='<div class="row">'; 
     inner_html+='<label for="Address_3_city">City</label>  <input name="Address[3][city]" id="Address_3_city" type="text" maxlength="200" />   </div> '; 
     inner_html+='<div class="row">'; 
     inner_html+='<label for="Address_3_state">State</label>  <input name="Address[3][state]" id="Address_3_state" type="text" maxlength="200" />   </div>'; 
    newdiv.innerHTML=inner_html; 
    $('#user-form').append(newdiv); 

}

這樣一來,我可以對從瀏覽器和用戶即時將添加按保存保存所有數據或提交按鈕只有一次子行的正數。

感謝大家的支持。

問候,

費薩爾

相關問題