引用網址:http://www.misterngan.com/1110/jqgrid-%E5%AF%A6%E7%94%A8%E6%8A%80%E5%B7%A7-%E5%8D%81-%E7%94%A8-custom_func-%E6%AA%A2%E6%9F%A5%E8%B3%87%E6%96%99%E7%9A%84%E5%94%AF%E4%B8%80%E6%80%A7/

很 多 時 候 ,在 資 料 表 的 數 據 ,隨 了 主 鍵 那 個 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 三 個 可 能 性 了 。

arrow
arrow
    文章標籤
    jquery jqGrid
    全站熱搜
    創作者介紹
    創作者 龍之家族 的頭像
    龍之家族

    龍之家族

    龍之家族 發表在 痞客邦 留言(0) 人氣()