DataTable Control: XML Data Over XHR With POST

このExampleは、先の「DataTable Control: JSON Data Over XHR」XML版である。
違いは

  1. YAHOO! Local Searchから取得するデータの形式がXML形式であること
  2. HTTPのメソッドとしてPOSTを用いていること

だけである。

YAHOO! Local SearchXMLを標準の出力形式としてもっているので、これはWeb ServiceへRESTリクエストを発行する際のqueryStringに、形式を指定するだけで変更できる。
あとは、DataSourceに対する属性の設定を変更する。
また、POSTメソッドへの変更も、DataSourceへの属性変更だけでよい。

出力される画面は、先の例と同じであるため省略する。

以下にJavascriptを含むHTMLの全文を示す。
サンプリングでは、先の例と同じ結果が得られるように、リクエストを複数回(3回)発行するように変更をした。JSONの場合との微妙な違いはソースコード中に注釈をつけてある。
また、この例でも、phpプログラムがConnection Managerに対してProxyの役割を担うが、phpプログラムも先の例のものを共用している。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
<title>Ajax Sample</title> 
 
<style type="text/css"> 
body {
	margin:0;
	padding:0;
}
</style> 

<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" /> 
<link rel="stylesheet" type="text/css" href="scripts/yui/datatable/assets/skins/sam/datatable.css" /> 
<script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script> 
<script type="text/javascript" src="scripts/yui/connection/connection-min.js"></script> 
<script type="text/javascript" src="scripts/yui/element/element-beta-min.js"></script> 
<script type="text/javascript" src="scripts/yui/datasource/datasource-min.js"></script> 
<script type="text/javascript" src="scripts/yui/datatable/datatable-min.js"></script>  

<style type="text/css" id="defaultstyle">
#main {
	margin: 2px;
	padding: 3px;
}
  
</style>

<script type="text/javascript"> 
YAHOO.util.Event.addListener(window, "load", function() {
    YAHOO.example.XHR_JSON = function() {

    	// カスタムフォーマッターの定義
    	// elCell; td、oRecord; レコードオブジェクト、sData: ※1でkey定義した変数値
        var formatUrl = function(elCell, oRecord, oColumn, sData) {
            elCell.innerHTML = "<a href='" + oRecord.getData("ClickUrl") + "' target='_blank'>" + sData + "</a>";
        };
 
        var myColumnDefs = [
            // ※1
            {key:"Title", label:"Name", sortable:true, formatter:formatUrl},
            {key:"Phone"},
            {key:"City"},
            // ここはJSONのときと違って、AverageRatingノード名をピンポイントで指定する。
            {key:"AverageRating", label:"Rating",formatter:YAHOO.widget.DataTable.formatNumber, sortable:true}
      // ClickUrlはデータとしてとってくるが、カスタムフォーマッターに使うだけで、列定義しない。
        ];
 
        var myDataSource = new YAHOO.util.DataSource("ajax_yui_datatable_json_over_XHR.Proxy.php?");

        // MethodをPOSTに指定。
        myDataSource.connMethodPost = true;

        // DataSourceのタイプをTYPE_XMLに指定。
        myDataSource.responseType = YAHOO.util.DataSource.TYPE_XML;

        // Connection Managerに任せるRequestは待ち行列に入れる。
        myDataSource.connXhrMode = "queueRequests";
        
        myDataSource.responseSchema = {
            // ここはJSONのときと違って、ノード名をピンポイントで指定する。
            resultNode: "Result",
            fields: ["Title","Phone","City","AverageRating","ClickUrl"]
        };
 
        var myDataTable = new YAHOO.widget.DataTable("xml", myColumnDefs,
                myDataSource, {initialRequest:"query=pizza&zip=96815-3289&results=10"});

	// コールバック・ハンドラー(success);thisはmyDataTable
	var mySuccessHandler = function() {
            // myDataTableに、コールバックデータ(arguments)をappendする。
            this.onDataReturnAppendRows.apply(this,arguments);
        };
        
	// コールバック・ハンドラー(failure);thisはmyDataTable
        var myFailureHandler = function() {
            this.showTableMessage(YAHOO.widget.DataTable.MSG_ERROR, YAHOO.widget.DataTable.CLASS_ERROR);
            // myDataTableに、コールバックデータ(arguments)をappendする。
            this.onDataReturnAppendRows.apply(this,arguments);
        };

        // Connection Managerのコールバック・オブジェクト
        var callbackObj = {
            success : mySuccessHandler,
            failure : myFailureHandler,
			// call backハンドラーにはmyDataTableを渡す。
            scope : myDataTable
        };
        
	// 非同期にConnection Managerの待ち行列にリクエストを入れる。これらは、次々とテーブルにAppendされる。
        myDataSource.sendRequest("query=mexican&zip=96815-3289&results=10&output=xml",
                callbackObj);
 
	// 非同期にConnection Managerの待ち行列にリクエストを入れる。これらは、次々とテーブルにAppendされる。
        myDataSource.sendRequest("query=chinese&zip=96815-3289&results=10&output=xml",
                callbackObj);
                
        return {
            oDS: myDataSource,
            oDT: myDataTable
        };
    }();
});
</script>
</head> 
 
<body class=" yui-skin-sam">
<div id="main">
<p>Yahoo! Local Searchからxmlデータを取得して、テーブルに表示します。</p>
<div id="xml"></div>
</div>
</body> 
</html>