2012-10-10 61 views
1

我嘗試使用CakePHP 2.1中的模型回調函數中的現有模型數據,但無法使其工作。 我所做的是我嘗試在beforeValidate()回調中獲得用戶角色,並檢查它是否爲空。如果是,我會設置它。通常我會這樣做,並且對於第一次創建的記錄來說它工作得很好。在CakePHP模型回調函數中接收模型數據

if (empty($this->data[$this->alias]['role'])) 
    $this->data[$this->alias]['role'] = 'user'; 

問題是,每當現有記錄(用戶)被更新時,角色將被重新設置。

問:那麼,我該如何檢查,如果場role在記錄數據,而不是POST數據已經設置(好像$this->data[$this->alias]只包含POST數據)?

回答

1

有三種解決這個問題,因爲我可以看到它。

  1. 坐落在數據庫列(最簡單,最好的嗎?)
  2. 添加角色到您的每次輸入一個默認值。
  3. 查找用戶並添加一個角色如果缺少

前兩個選項似乎是顯而易見的,所以我就說明在最後。

public function beforeValidate() { 
    if (!empty($this->id) { 
    $this->data[$this->alias][$this->primaryKey] = $this->id; 
    } 
    if (!empty($this->data[$this->alias][$this->primaryKey])) { 
    // user exists, check their data 
    $id = $this->data[$this->alias][$this->primaryKey]; 
    $user = $this->find('first', array(
     'conditions' => array($this->primaryKey => $id) 
    )); 
    $this->data[$this->alias]['role'] = $user[$this->alias]['role']; 
    } 
    if (empty($this->data[$this->alias]['role'])) { 
    // new user but missing a role 
    $this->data[$this->alias]['role'] = 'user'; 
    } 
    return true; 
} 

這個回調將檢查如果一個ID獲得通過,如果是的話它會查找用戶並填充role領域。然後,它檢查一個空的角色,並在必要時用缺省值填充它。顯然,他有更多的代碼,錯誤的可能性更大,所以我建議默認列值的第一個選項。

+0

謝謝Jeremy,這看起來像是一個很好而乾淨的解決方案。 –

+0

酷,很高興的選項之一工作!請記住,前兩個將始終是最快,最少(可能)錯誤的選項。 – jeremyharris

0

嘗試:

if (empty($this->data[$this->alias]['role']) && empty($this->role)) { 
    $this->data[$this->alias]['role'] = 'user'; 
} 
+0

我曾嘗試過,除'$ this-> id'字段總是返回'null'。 而且我可以通過控制器方法來識別ID正在工作,因爲我使用了$ this-> user-> id = $ id;'。 –