DataTable Control: Local XML Data

このExampleでも、また、以下のようなテーブルを作成する。

以前のExample「DataTable Control: XML Data Over XHR With POST」では、DataSourceで定義するソースとして、YAHOO! Local SearchへのProxyとなるPHPプログラムを指定した。この際、Connection Managerは内部的に利用されるだけであって、コールバックその他の処理は、DataSourceオブジェクトに隠蔽されていた。

ここではもっとシンプルに、Connection Managerを明示的に使い(YAHOO.util.Connect.asyncRequest()を使い)、そのコールバック関数で、XMLを抽出してテーブルを作成する。

この場合、テーブルヘッダーの生成がコールバック関数内に入ってしまうため、「Container Family: Creating a Modal "Loading" Panel」でサンプリングした、モーダル表示での待ち画面を出すようにした。下の図。

以下にJavascriptを含むHTMLの全文を示す。
YAHOO! Local SearchへのProxyとなるPHPプログラム()は「DataTable Control: XML Data Over XHR With POST」で利用したものである。

<!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" />
<link rel="stylesheet" type="text/css" href="scripts/yui/container/assets/skins/sam/container.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/container/container-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.Local_XML = function() {

        var myDataSource, myDataTable;

        // Connection Managerのコールバック関数でXMLデータを抽出して、DataSourceを生成する。
        var connectionCallback = {
            success: function(o) {
            	// xmlデータの抽出
                var xmlDoc = o.responseXML;
 
                var myColumnDefs = [
                    {key:"Title", label:"Name", sortable:true, formatter:"link"},
                    {key:"Phone"},
                    {key:"City"},
                    {key:"AverageRating", 
                        label:"Rating",
                        formatter:YAHOO.widget.DataTable.formatNumber, 
                        sortable:true}
                ];
 
                myDataSource = new YAHOO.util.DataSource(xmlDoc);
                myDataSource.responseType = YAHOO.util.DataSource.TYPE_XML;
                myDataSource.responseSchema = {
                    // Nodeは階層に関わらず、ピンポイントで指定する。
                    resultNode: "Result",
                    fields: ["Title","Phone","City","AverageRating","ClickUrl"]
                };
 
                myDataTable = new YAHOO.widget.DataTable("localxml", 
                        myColumnDefs, 
                        myDataSource);

                // パネルの消去
                wait.hide();
                
            },
            failure: function(o) {
                // パネルの消去
                wait.hide();
            }
        };

        // パネル(処理待ちのモーダル)の作成
		content = document.getElementById("localxml");
    	content.innerHTML = "";
   	    wait = new YAHOO.widget.Panel("wait",  
                                { 	width: "240px", 
                                    fixedcenter: true, 
                                    close: false, 
                                    draggable: false, 
				// 一番上に出す。
                                    zindex:4,
				// Modal指定。
                                    modal: true,
				// showされるまでは見えない。
                                    visible: false
                                 } 
        	);
       	wait.setHeader("Loading, please wait...");
       	wait.setBody('<img src="http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif"/>');
       	wait.render(document.body);
        // パネルの表示
        wait.show();

        // PHPプログラムのProxyを通して、Connection Managerでデータを取得する。(XML形式)
        var getXML = YAHOO.util.Connect.asyncRequest("GET",
                "ajax_yui_datatable_json_over_XHR.Proxy.php?query=pizza&zip=96815-3289&results=10",
                connectionCallback);
        
        return {
            oDS: myDataSource,
            oDT: myDataTable
        };
    }();
});
</script>
</head> 
 
<body class=" yui-skin-sam">
<div id="main">
<p>Connection ManagerのコールバックでresponseXMLを受け取り、テーブルを生成します。</p>
<div id="localxml"></div>
</div>
</body> 
</html>