很 多 時 候 ,在 資 料 表 的 數 據 ,隨 了 主 鍵 那 個 index number 之 外 ,有 很 多 其 他 的 field 我 們 也 會 設 定 成 唯 一 的 (Unique)。那 如 何 使 用 jqGrid 的 custom_func,在 插 入 資 料 之 前 去 檢 查 一 下 使 用 者 輸 入 的 資 料 在 之 前 是 不 是 已 經 出 現 過 呢 ?
我 自 己 的 習 慣 是 用 jQuery 的 ajax 來 做 。在 下 面 的 例 子 裡 ,我 有 一 個 field 是 rankname,是 用 來 儲 存 職 位 名 稱 的 。在 資 料 表 裡 面 已 經 有 rankcode 作 為 主 鍵 ,所 以 rankname 就 只 是 唯 一 鍵 。
...
colModel :[
....
{name:'rankname',index:'rankname',editable:true,edittype:'text',editoptions:{size:20,maxlength:20},editrules:{required:true,custom:true,custom_func:checkRank}},
....
],
...
|
在 checkRank 裡 面 ,我 用 jQuery.ajax 把 使 用 者 輸 入 的 資 料 傳 到 checkrankname.php 去 檢 查 ,再 按 它 傳 回 來 結 果 處 理 。
特 別 要 留 心 的 是 ,async 必 須 設 置 為 false,意 思 就 是 強 制 它 做 同 步 處 理 ,即 是 要 等 到 有 結 果 傳 回 ,程 式 才 會 繼 續 執 行 下 去 。大 概 有 很 多 朋 友 都 試 過 在 這 個 小 小 的 設 定 上 面 出 問 題 。
...
function checkRank(posdata, obj){
var result = null;
jQuery.ajax({
async: false, //this is crucial
url: 'checkrankname.php',
type: 'post',
data: {rankname: posdata.rankname},
dataType: 'json',
success: function (data) {
if (data.success) {
result = [true, '']
} else {
result = [false,'職 位 名 稱 : ' + data.rankname + ' 已 使 用 '];
}
},
error: function () { alert('Error trying to validate rankname ' + posdata.rankname); }
});
return result;
}
...
|
至 於 那 個 php 檔 ,最 簡 單 的 大 概 就 是 像 下 面 的 樣 子 。
...
$rankname = $_POST['rankname'];
openConnection();
$strSQL = "SELECT rankname FROM rank_table WHERE rankname='$rankname' ";
$rankcheck = mysql_query($strSQL);
$rankcheck2 = mysql_num_rows($rankcheck);
if ($usercheck2 > 0) {
$data['success'] = false;
$data['rankname'] = $rankname;
} else {
$data['success'] = true;
$data['rankname'] = $rankname;
}
echo json_encode($data);
...
|
但 也 有 些 時 候 ,要 檢 查 唯 一 值 的 field 多 於 一 個 ,筆 者 也 會 把 custom function 放 在 beforeSubmit 裡 面 執 行 。在 第 二 個 例 子 ,我 們 有 branchcode 和 branchname,是 存 放 分 行 編 碼 和 分 行 名 稱 的 。
...
$("#list").jqGrid({
...
colModel :[
....
{name:'branchcode',index:'branchcode',editable:true,edittype:'text',editoptions:{size:20,maxlength:20},editrules:{required:true}},
{name:'branchname',index:'branchname',editable:true,edittype:'text',editoptions:{size:100,maxlength:100},editrules:{required:true}},
....
],
pager: '#pager',
...
|
但 這 次 我 們 不 用 custom_func,而 把 function 放 在 pager 裡 面 的 add 和 edit 裡 面 的 beforeSubmit。
...
$("#list").jqGrid('navGrid','#pager',
{edit:true,add:true,del:false,search:true,view:true},
{beforeSubmit:checkBranch},
{beforeSubmit:checkBranch},
{},
{},
{}
);
...
|
至 於 那 條 function 也 大 同 小 異 。
...
function checkBranch(posdata, obj){
var result = null;
jQuery.ajax({
async: false, //this is crucial
url: 'checkbranch.php',
type: 'post',
data: {branchname: posdata.branchname, branchcode: posdata.branchcode},
dataType: 'json',
success: function (data) {
if (data.success==0) {
result = [true, '']
} else if (data.success==1) {
result = [false,'分 行 名 稱 : ' + data.branchname + ' 已 使 用 '];
} else if (data.success==2) {
result = [false,'分 行 編 碼 : ' + data.branchcode + ' 已 使 用 '];
}
},
error: function () { alert('Error trying to validate branch name'); }
});
return result;
}
...
|
因 為 一 次 過 檢 查 多 於 一 個 field,所 以 傳 回 的 success 變 數 就 由 true / false 變 為 0 / 1 / 2 三 個 可 能 性 了 。
留言列表