2014-03-04 81 views
4

我試圖向JSON輸出一個ColdFusion查詢,以便它可以與jQuery EasyUI(特別是Datagrid)一起使用。ColdFusion 9,JSON和jQuery EasyUI

從以.json附帶EasyUI這個文件的例子是,他們正在尋找...

{"total":2 
    , "rows":[ 
      { "productid":"FI-SW-01" 
       , "productname":"Koi" 
       , "unitcost":10.00 
       , "status":"P" 
       , "listprice":36.50,"attr1":"Large" 
       , "itemid":"EST-1" 
      } 
      , { "productid":"K9-DL-01" 
      , "productname":"Dalmation" 
      , "unitcost":12.00 
      , "status":"P" 
      , "listprice":18.50 
      , "attr1":"Spotted Adult Female" 
      , "itemid":"EST-10" 
      } 
     ] 
} 

格式然而,當我在一個ColdFusion查詢中使用SerializeJSON(emails)我得到這個:

{ "COLUMNS":["CUSTOMERID","CUSTOMERFIRSTNAME"] 
    , "DATA":[ 
       [101,"Bhavin"],[102,"Frank"] 
      ] 
} 

這似乎並沒有被EasyUI識別,所以我想問題是:(1)EasyUI能夠如圖所示識別並使用ColdFusion的輸出,或者(2)有沒有辦法讓ColdFusion輸出JSON採用EasyU中包含的格式我舉例?

更新:

這是什麼樣子,如果我使用serializeQueryByColumns參數:

{ "ROWCOUNT":83 
    , "COLUMNS":["CUSTOMERID","CUSTOMERFIRSTNAME"] 
    , "DATA":{ 
      "CUSTOMERID":[101,102] 
      ,"CUSTOMERFIRSTNAME":["Bhavin","Frank","] 
      } 
} 

還沒通過EasyUI承認雖然。在他們的文檔,他們表現出的PHP例子看起來像這樣,所以它的這個輸出,我會試圖使用ColdFusion我想複製:

$rs = mysql_query('select * from users'); 
$result = array(); 
while($row = mysql_fetch_object($rs)){ 
    array_push($result, $row); 
} 

echo json_encode($result); 

謝謝!

+0

看起來不像你的查詢有所有你會需要的列!我想說你必須手動創建它,例如你如何期待SerializeJSON()將query.RecordCount添加到'total'中? – duncan

+3

由於您可能需要反覆做這個,我建議將功能包裝到UDF中。一旦你完成了,你也應該考慮將它提交給CFLib.org,因爲可能有其他人可以從你的工作中受益。另一個類似於你的是:http://www.cflib.org/udf/queryConvertForjqGrid – existdissolve

+0

鄧肯,如果我使用serializeQueryByColumns選項,它實際上公開記錄計數,因爲... ROWCOUNT「:2。因此,該功能是能夠 – Bryan

回答

6

datagrid的loadFilter函數可以將任何數據轉換爲可以加載到datagrid中的標準數據格式。

<script> 
var data = { "ROWCOUNT":83 
    , "COLUMNS":["CUSTOMERID","CUSTOMERFIRSTNAME"] 
    , "DATA":{ 
      "CUSTOMERID":[101,102] 
      ,"CUSTOMERFIRSTNAME":["Bhavin","Frank"] 
      } 
}; 
function myLoadFilter(data){ 
    var result = {total:data.ROWCOUNT}; 
    var rows = []; 
    var count = data.DATA[data.COLUMNS[0]].length; 
    for(var i=0; i<count; i++){ 
     var row = {}; 
     $.map(data.COLUMNS, function(field){ 
      row[field] = data.DATA[field][i]; 
     }) 
     rows.push(row); 
    } 
    result.rows = rows; 
    return result; 
} 
</script> 

DataGrid組件可以聲明爲:

<table class="easyui-datagrid" title="Basic DataGrid" style="width:700px;height:250px" 
     data-options=" 
      singleSelect:true, 
      collapsible:true, 
      data:data, 
      loadFilter:myLoadFilter 
     "> 
    <thead> 
     <tr> 
      <th data-options="field:'CUSTOMERID',width:100">CUSTOMERID</th> 
      <th data-options="field:'CUSTOMERFIRSTNAME',width:200">CUSTOMERFIRSTNAME</th> 
     </tr> 
    </thead> 
</table> 

的例子可從http://jsfiddle.net/d8zYy/

+1

太棒了,謝謝!這個順便說一句,是爲了回覆我的電子郵件支持,很高興看到有人支持他們的產品,希望這可以幫助他人。 – Bryan

4

它看起來並不像EasyUI DataGris將接受數據的自定義格式(這是一種恥辱,因爲數據網格看上去很漂亮除此之外)

它應該是簡單的CF查詢轉換成對於EasyUI正確的格式:

  • 創建一個結構來保存數據
  • 集struct.total = query.RecordCount(如果這就是它想對於遠程分頁,它更可能是總結果,不管當前頁面)
  • 設置struct.rows = ArrayNew(1)
  • 循環通過查詢(<cfloop query='myQuery'>
  • 創建一個新的結構,rowData
  • 遍歷字段( 'myQuery.columnList')
  • 集struct.columnName =更改爲MyQuery [ '列名']
  • ArrayAppend(struct.rows,rowData)
  • 收益結構

我開始懷疑,寫高於T該列表只要寫實際功能...