我檢查下面的數據,如果數據在表單字段中有更新表。問題是如果我點擊按鈕兩次(它的ajax)它將插入第二行。我怎樣才能防止它。 謝謝在更新它插入另一行
function update() {
if (!empty($this->data)) {
$this->Test->saveAll($this->data['Test'])
}
}
我檢查下面的數據,如果數據在表單字段中有更新表。問題是如果我點擊按鈕兩次(它的ajax)它將插入第二行。我怎樣才能防止它。 謝謝在更新它插入另一行
function update() {
if (!empty($this->data)) {
$this->Test->saveAll($this->data['Test'])
}
}
問題是表單沒有id字段,所以cakephp插入一個新行。
簡單的方法是在保存之前檢查是否存在具有相同值的另一條記錄。
您可以檢查模型的beforeSave()函數而不是Controller動作。
你應該採取雙管齊下的辦法來防止這樣的:
首先,禁止在提交的提交按鈕。例如在jQuery中:
$('#form_id').submit(function(event) {
event.preventDefault();
$('input[type=submit]', this).attr('disabled', 'disabled');
// submit form via ajax...
}
其次,執行合理檢查服務器端防止重複保存。例如,一分鐘內提交的兩個相同的記錄將被視爲錯誤。我可能會通過在其中一個始終需要的字段之一上創建自定義驗證規則來做到這一點。在你的模型:
var $validate = array(
'myfield' => array(
'rule' => 'duplicateCheck',
'message' => 'Duplicate record'
)
);
function duplicateCheck() {
$conditions = array(
'Model.field1' => $this->data['Model']['field1'],
...
'Model.created >' => date("Y-m-d H:i:s", time() - 60)
);
return !$this->hasAny($conditions);
}
然後在你的控制器,我想如果保存失敗,這是因爲特定的驗證規則將用戶重定向到現有記錄。這讓用戶移動而不必關心任何問題。
function add() {
if(isset($this->data)) {
if($this->Model->save($this->data)) {
...
} else {
if(isset($this->Model->validationErrors['myfield'])) {
// find the existing record and redirect user to view it
}
}
}
}
也許最好是發佈Javascript代碼。 $ this-> data的內容是什麼? – Leo 2011-04-25 21:23:29