2013-07-27 63 views
0

領域獲得驗證的反饋,我非常新的Yii framework現在爲止,我享受了很多與它一起工作。我在我自己的第一個項目,我有點卡在以下問題。Yii框架 - 上beloning其他車型

我有兩個型號StudentTeacher。它們與外鍵無關,但學生表的teacher_id字段屬於Teacher表。 (不太清楚,但如何與他們聯繫,但這是我將不得不擔心的另一個故事)。

當使用表格在視圖中更新學生時,我也爲老師編寫了表格(全名,年齡等),但是作爲學生表格的一部分,它不受益於驗證規則集在學生模型中。 當我保存的教師信息(同POST請求期間,節省了學生場之前),驗證似乎工作,因爲它不會保存,如果缺少必要的字段,但它並沒有還給學生表單,驗證錯誤就像它自己的必填字段一樣。 我希望這不是太混亂,但我不知道如何更好地解釋它。

任何想法非常歡迎!

+0

你的代碼是什麼?沒有它就很難說清楚。 – Jonnny

回答

1

你可以用這種格式的模型文件中聲明的關係,不需要有一個外鍵申報的關係,但如果有一個你的查詢將執行得更快......

'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)

的例如,對於你的情況可能是這樣的..

public function relations() { 
    return array(
     'student' => array(self::BELONGS_TO, 'teacher', 'teacher_id'), 
    ); 
} 

對於在同一個形式使用多個型號查詢,它不是從你的描述究竟發生了,很清楚從我unders tood你正在使用多個table_models在相同的形式,雖然這是可能的,這是相當複雜的。

,我建議您將使用單一的形式處理多個表項單獨的表單模型

+0

謝謝你的提示Manquer。非常有幫助,我會盡力把這條規則付諸實踐。至於關係,我在此期間再讀一些內容,而且事實上,當你向我展示時,我是這樣做的。 –

1

不知道我正確理解你的問題,但如果你想以相同的形式來驗證和保存兩種模式,你可以做到這一點喜歡這個。

控制器:

$teacherModel = new Teacher; 
$studentModel = new Student; 

if(isset($_POST['Teacher']) && isset($_POST['Student'])) 
{ 
    $teacherModel->attributes = $_POST['Teacher']; 
    $studentModel->attributes = $_POST['Student']; 

    // check both models for validation errors before saving and redirecting. 
    $teacherValid = $teacherModel->validate(); 
    $studentValid = $studentModel->validate(); 

    if($teacherValid && $studentValid) 
    { 
     $teacherModel->save(false); // false = don't perform validation before saving 
     $studentModel->save(false); 

     $this->redirect(array('view','id'=>$studentModel->id)); 
    } 
} 

$this->render('create',array(
     'teacherModel'=>$teacherModel, 
     'studentModel'=>$studentModel, 
    )); 

這將確保這兩種模式都是有效的重定向之前,否則會返回到表單。

然後,您可以通過將其在陣列中的方法$顯示在你看來這兩種模型驗證錯誤形式 - > errorSummary:

<?php echo $form->errorSummary(array($teacherModel, $studentModel)); ?> 
+0

其實你的編號能夠解決我的問題,你放下它的方式幾乎和我一樣。缺失的部分是從驗證發送錯誤到代碼中的最後一部分代碼。我應該仔細看看「errorSummary」方法。我不知道它可以作爲一系列模型的參數。 –

0

所以,我想這(基督教什麼建議),並同時驗證似乎工作,errorSummary方法不會做它的工作。如果我錯過了教師窗體上的必填字段,它不會保存它,但它不會返回錯誤摘要。我注意到有趣的是,如果我錯過了學生形式中的必填字段,它給了我很好的紅色錯誤字段,但是當我在這些字段中輸入了一些內容後,我忽略了教師形式中的一個必填字段,這次錯誤教師總結,確實顯示。這有點令人困惑。最後我又走了一條路。我首先檢查教師窗體,如果它不驗證,我循環通過Teacher-> model() - >錯誤,創建一個無序列表,並將其作爲閃存消息發送給查看器。到目前爲止,它的工作方式確定。也許在將來,隨着我變得更加知識淵博,我可以返回並改進這些代碼。