ColdFusion 9, JSON, and jQuery EasyUI



我正在尝试将ColdFusion查询输出到JSON,以便它可以与jQuery EasyUI(特别是Datagrid)一起使用。

从 EasyUI 附带的示例 .json 文件来看,这是他们正在寻找的格式......

{"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 以类似于 EasyUI 示例中包含的格式输出 JSON?

更新:

如果我使用 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);

谢谢!

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>

数据网格组件可以声明为:

    <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/

看起来

EasyUI DataGris不会接受自定义的数据格式(这是一种耻辱,因为除此之外,数据网格看起来非常好)

将 CF 查询转换为 EasyUI 的正确格式应该很简单:

  • 创建结构以保存数据
  • 设置结构.总计=查询。RecordCount(如果这是它想要的。对于远程分页,无论当前页面如何,它都更有可能是总结果)
  • set struct.rows=ArrayNew(1)
  • 循环查询 ( <cfloop query='myQuery'>
  • 创建一个新结构,行数据
  • 遍历字段('myQuery.columnList')
  • set struct.columnName = myQuery['columnName']
  • ArrayAppend(struct.rows,rowData)
  • 返回结构

我开始怀疑写上面的列表和写实际函数一样长......

最新更新