DataTable Control: Progressive Enhancement

このExampleは、「DataTable Control: Basic Example」をやった後では以下の意味だけ持つものと考えていいと思う。

  • markupで記述したテーブル(tableタグ)から、下のようなテーブル表現を得る。

下の図は、YUIのExampleを

  1. 日付をmm/dd/yyyy形式から、yyyy/mm/ddに変えた
  2. 通貨記号を"$"(Dollar Mark)から、"¥"(Yen Mark)に変えた

ものである。

markupで記述したテーブルから、上のようなテーブルを得るには、

  • tableをmarkupで記述する際に、見出し(theader)とボディー(tbody)を分ける。
  • 以下のような書き方で、DataSourceの定義をする。
	myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("accounts"));
       	myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; 
    (ここで、"account"とは、tableにつけたid)
  • tableの各要素(td)を読み込む際に、フィールド名と、parserの指定をする。parserはカスタムで作成できる。

以下にJavascriptを含むHTMLの全文を示す。
テーブルの幅の変更(resize)を指定してみたが、このケースでは、効かないようである。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Ajax_Sampling</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/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/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;
	width: 560px;
	height: auto;
	border:1px dashed #999999;
}

/* custom styles for this example */
.yui-skin-sam .yui-dt-liner { 
	white-space:nowrap; 
}  
</style>

<script type="text/javascript">
YAHOO.namespace("EGP");

YAHOO.EGP.SimpleDataTable = function() {
	var myDataSource;
	var myDataTable;
	
    var myColumnDefs = [
                        {key:"due",
                    		label:"Due Date",
                    		formatter:YAHOO.widget.DataTable.formatDate,
                    		sortable:true},
                        {key:"account",
                            label:"Account Number", 
                            sortable:true,
                            // TYPE_HTMLTABLEの場合、resizeが効かない??
                            resizeable:true},
                        {key:"quantity",
                        	label:"Quantity",
                        	formatter:YAHOO.widget.DataTable.formatNumber,
                        	sortable:true,
                        	resizeable:true},
                        {key:"amount",
                        	label:"Amount Due",
                        	formatter:YAHOO.widget.DataTable.formatCurrency,
                        	sortable:true}
	];

    // カスタム・パーサー
    // markupで &#x00a5;150.00 なっているものを、150.00のfloatに直す。         
	var parseNumberFromCurrency = function(sString) {
    	// Remove dollar sign and make it a float
    	return parseFloat(sString.substring(1));
    };
	
	return{
    	init: function() {
			myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("accounts"));
        	myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
        	// HTMLTABLEの頭からフィールド名をつけて、parseしてデータにする。
        	myDataSource.responseSchema = {
            	fields: [{key:"due", parser:"date"},
                	 {key:"account"},
                    	 {key:"quantity", parser:"number"},
                    	 // 上でprovateに定義しているカスタムパーサーを使う。
                    	 {key:"amount", parser:parseNumberFromCurrency}
            	        ]
        	};

        	myDataTable = new YAHOO.widget.DataTable("markup", myColumnDefs, myDataSource,
                    {	caption:"Example: Progressively Enhanced Table from Markup",
                    	sortedBy:{key:"due",dir:"desc"},
						// Yen markを出すには、、、、html表現でやっとでた。
                        currencyOptions:{prefix: "&#x00a5;", decimalPlaces:2, decimalSeparator:".", thousandsSeparator:","},
						// 年月日に変更
                        dateOptions:{format:"%Y/%m/%d", locale:"ja"}
        		}
            );
		},
		// おまじない
        oDS: myDataSource,
        oDT: myDataTable
	};
}();
		
//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
		//DomReadyイベントで発火するハンドラ
		YAHOO.EGP.SimpleDataTable.init,
		//ハンドラに渡すオブジェクト(関数)
		YAHOO.EGP.SimpleDataTable,
		//ハンドラは、上記のオブジェクトのスコープをもつ。   
		true
);
</script>
</HEAD>

<BODY class="yui-skin-sam">
<div id="main">
<p>
MarkupからDataTableを作るサンプルです。
</p>
<div id="markup"> 
    <table id="accounts"> 
    	<!-- theadはHTML_TABLEとして読み込まれない -->
        <thead> 
            <tr> 
                <th>Due Date</th> 
                <th>Account Number</th> 
                <th>Quantity</th> 
                <th>Amount Due</th> 
            </tr> 
        </thead> 
        <tbody> 
            <tr> 
                <td>1999/1/23</td> 
                <td>29e8548592d8c82</td> 
                <td>12</td> 
                <td>&#x00a5;150.00</td> 
            </tr> 
            <tr> 
                <td>1999/5/19</td> 
                <td>83849</td> 
                <td>8</td> 
                <td>&#x00a5;60.00</td> 
            </tr> 
            <tr> 
                <td>1999/8/9</td> 
                <td>11348</td> 
                <td>1</td> 
                <td>&#x00a5;34.99</td> 
            </tr> 
            <tr> 
                <td>2000/1/23</td> 
                <td>29e8548592d8c82</td> 
                <td>10</td> 
                <td>&#x00a5;1.00</td> 
            </tr> 
            <tr> 
                <td>2000/4/28</td> 
                <td>37892857482836437378273</td> 
                <td>123</td> 
                <td>&#x00a5;33.32</td> 
            </tr> 
            <tr> 
                <td>2001/1/23</td> 
                <td>83849</td> 
                <td>5</td> 
                <td>&#x00a5;15.00</td> 
            </tr> 
            <tr> 
                <td>2001/9/30</td> 
                <td>224747</td> 
                <td>14</td> 
                <td>&#x00a5;56.78</td> 
            </tr> 
        </tbody> 
    </table> 
</div> 
</div>
</BODY>
</HTML>