2011-12-17 55 views
1

假設我有一個模型項目,owner_id代表項目的所有者。創建新項目時,用戶需要輸入所有者的名稱而不是id。我編寫了一個驗證方法來確保用戶確實存在於系統中,然後我可以獲取用戶的ID。規則是:如何在調用保存在CActiveRecord中的方法之前驗證屬性?

array('owner_name', 'userValidation') 

但我發現,驗證,只有當下面的語句執行

$model->save() 

這意味着所謂的,如果我試圖得到一個用戶的ID沒有在系統之前的保存與陳述

$model->validate(); 
$user=User::model()->findByAttributes(array('username'=>$model->owner_name)); 
$model->owner_id=$user->id; 

會有例外。所以我的問題是爲什麼當我調用validate()方法時驗證不能按預期工作?我已經檢查方法的源代碼保存在Yii中

public function save($runValidation=true,$attributes=null) 
    { 
      if(!$runValidation || $this->validate($attributes)) 
        return $this->getIsNewRecord() ? $this->insert($attributes) : $this->update($attributes); 
      else 
        return false; 
    } 

我想這也嘗試通過電話驗證的validate()。

回答

2

您沒有檢查validate()的返回值。試試這樣的:

if ($model->validate()) { 
    $user=User::model()->findByAttributes(array('username'=>$model->owner_name)); 
    $model->owner_id=$user->id; 
    /// ... 
} else { 
    // handle the case that userValidation failed 
} 
相關問題