2011-05-03 59 views
0

我正在使用Cakephp並試圖加入一種方法來確保我們的預訂系統不會讓兩個用戶預訂相同的約會。防爆。用戶1打開約會,用戶2同時打開它。用戶1預約該預約。用戶2試圖預訂它,但系統檢查並發現它不再可用。如何避免在保存數據時出錯 - Cakephp

我想這會發生在驗證,或beforeSave(),但不知道如何去做。

現在我在模型中做了一個函數來從控制器調用。在控制器中,我有:

if ($this->Timeslot->checkIfNotAvailable()) { 
$this->Session->setFlash('This timeslot is no longer available'); 
$this->redirect(array('controller' => 'users', 'action' => 'partner_homepage')); 
} 

,並在模型中我有這樣的功能:

function checkIfNotAvailable($data) { 
    $this->recursive = -1; 
    $timeslot = $this->find('all', array(
     'conditions' => array(
      'Timeslot.id' => $this->data['Timeslot']['id']) 
     ) 
    ); 
    if ($timeslot['student_id'] == 0) { 
     //They can reserve it, do not spring a flag 
     return false; 
    } else { 
     //Throw a flag! 
     return true; 
    } 
} 

我覺得我混了使用自定義的驗證,當它不叫了。這顯然不起作用。有什麼建議麼?

謝謝!

回答

1

如果你有什麼工作,你可以堅持下去,你也可以嘗試在你的模型中創建一個beforeValidate()回調函數。

class YourModel extends AppModel { 
    function beforeValidate(){ 
     if(!$this->checkIfNotAvailable($this->data)) { 
     unset($this->data['YourModel']['time_slot']); 
     } 
     return true; //this is required, otherwise validation will always fail 
    } 
} 

這樣你刪除TIME_SLOT它去驗證之前,它會在這一點上落驗證錯誤,踢用戶返回到編輯頁面,並讓他們選擇不同的時間段,最好更新數據輸入頁面將不再具有可用的時隙。

+0

您好史提夫,謝謝您的建議。我的方式現在不能正常工作......你看到我在用這種方法做什麼時會出現任何錯誤? – tnichols 2011-05-04 00:26:50

+0

我會嘗試你現在的建議。 – tnichols 2011-05-04 00:27:01

+0

您的嘗試可能失敗,因爲您正在使用'find('all')'這將返回整個記錄數組,這使得無法測試'$ timeslot ['student_id']'。 試着將它切換到一個'find('first')',你可能沒問題。 – stevecomrie 2011-05-04 02:26:35