2012-06-26 70 views
1

我試圖合併3個模型來創建第四個視圖。我有model1,model2model3,我想將它們合併爲modelMaster。我也爲他們創建了控制器。當我撥打modelMaster/create動作時,我呈現modelMaster/create視圖,該視圖呈現modelMaster/_form視圖。在這個_form視圖中,我也想呈現model1/_formmodel2/_formCHtml::dropDownList(),這些數據來自model3。但是,這不起作用。我怎樣才能將這三種不同的觀點結合起來?單個創建視圖上的多個_form視圖[Yii]

+1

當你這樣做會發生什麼?你說它不起作用,但會發生什麼?腳本是否崩潰,是否產生輸出等? –

+0

嵌套'form'元素!所以如果我點擊主提交按鈕,它什麼都不做! – acidghost

+0

好吧,您必須在您的表單中顯示您現在擁有的代碼。並告訴你想要什麼確切的行爲,即如果你不想嵌套,你希望表單行爲如何。請在你的問題上更清楚一點。 –

回答

1

如果試圖跳過形式從_form觀點生成和使用獨特的型號名稱,我想你可以使用本手冊:single form with more models 所以生成表單定義的總處理父視圖和_form唯一的輸入

其他方式使用單個模型視圖,創建由延長CFormModel一個表單模型,並處理數據這個模型和包裹子模型之間的結合

1

如果您想窩幾種形式到一個主表,您必須相應地調整表單模板。您所有的modelMaster/create,model1/_form,model2/_form -views創建並呈現新的CActiveForm(以及因此幾個<form>標籤)。

因爲你不能在HTML嵌套形式元素(應該怎麼html的知道哪些行爲將數據傳遞給)你必須這樣做,以避免這種情況如下:

  1. 提取表單的輸入您想嵌入一個新的視圖,例如model1/_formInputs會是什麼樣子

    ... 
    <?php echo $form->labelEx($model,'name'); ?> 
    <?php echo $form->textField($model,'name'); 
    <?php echo $form->error($model,'name'); 
    ... 
    
  2. 改變model1/create和其他意見,並獲得在這裏創建的,通過指定的$this->beginWidget給變量$form回報形式的引用(如果尚未完成):

    <?php $form = $this->beginWidget('CActiveForm', array(
        'id'=>'foo', 
    )); ?> 
    

    <?php $this->renderPartial('model1/_formInputs', array('form' => $form); ?> 
    

    替換原有的輸入字段現在,例如如預期

  3. 爲了讓您的多型號形式工作,你只需要拿到參考modelMaster/create創建的窗體,並用它的RenderPartial所有您需要的*/_formInputsmodel1/create - 視圖應該工作。還請記住將輸入的模型包含到renderPartial-call中。所以modelMaster/create看起來是這樣的:

    <?php $form = $this->beginWidget('CActiveForm', array(
        'id'=>'foo', 
    )); ?> 
    
    /* Master Inputs here */ 
    
    // Rendering other models' inputs 
    <?php $this->renderPartial('model1/_formInputs', array('form' => $form, 'model' => $model1); ?> 
    <?php $this->renderPartial('model2/_formInputs', array('form' => $form, 'model' => $model2); ?> 
    
    /* Render Form Buttons here */ 
    
    <?php $this->endWidget(); ?> 
    
0

使用Ajax提交,Yii中很容易做到,這將使事情變得容易在控制器瞭解,每個控制器將有一個保存和使用JSON迴應確認保存。已經有ajax驗證。

/** 
* Performs the AJAX validation. 
* @param CModel the model to be validated 
*/ 
protected function performAjaxValidation($model) 
{ 
    if(isset($_POST['ajax']) && $_POST['ajax']==='employee-form') 
    { 
     $valid = CActiveForm::validate($model); 
     if(strlen($valid) > 2) { 
      echo $valid; 
      Yii::app()->end(); 
     }  
    } 
} 

,你可以看到我已經修改了它返回的錯誤,如果有一個(驗證返回[]如果它是有效的,我也許應該檢查該代替strlen的> 2),否則讓腳本繼續,在這種情況下,它將轉到保存功能。