Rico LiveGrid は 2 次元の JavaScript 配列でデータをバッファリングして、スクロールするテーブルにデータを表示します。 ユーザがグリッドを垂直にスクロールする事によって、データは配列からグリッド上へ動的にコピーされます。 バッファは次の項目からロードされる事が出来ます。
var myData = [
[1,'Cell 1:2','Cell 1:3','Cell 1:4','Cell 1:5'],
[2,'Cell 2:2','Cell 2:3','Cell 2:4','Cell 2:5'],
[3,'Cell 3:2','Cell 3:3','Cell 3:4','Cell 3:5'],
[4,'Cell 4:2','Cell 4:3','Cell 4:4','Cell 4:5']
];
Rico.loadModule('LiveGrid','LiveGridMenu','greenHdg.css');
var buffer=new Rico.Buffer.Base(); buffer.loadRowsFromArray(myData);
var opts = {
useUnformattedColWidth: false,
defaultWidth : 90,
visibleRows : 'data',
frozenColumns: 1,
columnSpecs : [{Hdg:'Column 1',type:'number', ClassName:'alignright'},
{Hdg:'Column 2'},
{Hdg:'Column 3'},
{Hdg:'Column 4'},
{Hdg:'Column 5'}]
};
var ex1=new Rico.LiveGrid ('ex1', buffer, opts);
ex1.menu=new Rico.GridMenu();
<script type='text/javascript'>
Rico.loadModule('LiveGrid','LiveGridMenu','greenHdg.css');
Rico.onLoad( function() {
var myData = [
[1,'Cell 1:2','Cell 1:3','Cell 1:4','Cell 1:5'],
[2,'Cell 2:2','Cell 2:3','Cell 2:4','Cell 2:5'],
[3,'Cell 3:2','Cell 3:3','Cell 3:4','Cell 3:5'],
[4,'Cell 4:2','Cell 4:3','Cell 4:4','Cell 4:5']
];
var opts = {
useUnformattedColWidth: false,
defaultWidth : 90,
visibleRows : 'data',
frozenColumns: 1,
columnSpecs : [{Hdg:'Column 1',type:'number', ClassName:'alignright'},
{Hdg:'Column 2'},
{Hdg:'Column 3'},
{Hdg:'Column 4'},
{Hdg:'Column 5'}]
};
var buffer=new Rico.Buffer.Base();
buffer.loadRowsFromArray(myData);
var ex1=new Rico.LiveGrid ('ex1', buffer, opts);
ex1.menu=new Rico.GridMenu();
});
</script>
<p class="ricoBookmark"><span id="ex1_bookmark"> </span></p> <div id="ex1"></div>
<thead> セクションにより、データは <tbody> セクションにより、HTML テーブルを定義して下さい。
ブックマークのためのマークアップを含む事により、グリッドのスクロール位置が表示されます。
<p class="ricoBookmark"><span id="data_grid_bookmark"> </span></p>
<table id="data_grid">
<thead>
<tr>
<th>First column name</th>
<th>Second column name</th>
...
<th>Last column name</th>
</tr>
</thead>
<tbody>
<tr>
<td>Row 1, column 1 data</td>
<td>Row 1, column 2 data</td>
...
<td>Row 1, last column data</td>
</tr>
<tr>
<td>Row 2, column 1 data</td>
<td>Row 2, column 2 data</td>
...
<td>Row 2, last column data</td>
</tr>
...
<tr>
<td>Row n, column 1 data</td>
<td>Row n, column 2 data</td>
...
<td>Row n, last column data</td>
</tr>
</tbody>
</table>
Rico.loadModule('LiveGrid','LiveGridMenu','greenHdg.css');
var buffer = new Rico.Buffer.Base($('data_grid').tBodies[0]);
var grid_options = { columnSpecs: [ {width:50}, {width:80} ] };
var grid = new Rico.LiveGrid('data_grid', buffer, grid_options);
<script type='text/javascript'>
Rico.loadModule('LiveGrid','LiveGridMenu','greenHdg.css');
Rico.onLoad( function() {
var buffer = new Rico.Buffer.Base($('data_grid').tBodies[0]);
var grid_options = { columnSpecs: [width:50, width:80] };
var grid = new Rico.LiveGrid('data_grid', buffer, grid_options);
});
</script>
<p class="ricoBookmark"><span id="data_grid_bookmark"> </span></p>
<table id="data_grid">
<tr>
<th>First column name</th>
<th>Second column name</th>
</tr>
</table>
Rico.loadModule('LiveGridAjax','LiveGridMenu','greenHdg.css');
var buffer = new Rico.Buffer.AjaxXML('/controller/action?format=xml');
この URL(実例の中にある "/controller/action?format=xml")は、次のフォーマットでデータを返さなければなりません。
<ajax-response> <response type='object' id='data_grid_updater'> <rows update_ui='true' offset='0'> <tr><td>Data for row 1, cell 1</td><td>Data for row 1, cell 2</td></tr> <tr><td>Data for row 2, cell 1</td><td>Data for row 2, cell 2</td></tr> </rows> </response> </ajax-response>
var grid_options = { columnSpecs: [,] };
var grid = new Rico.LiveGrid('data_grid', buffer, grid_options);
<script type='text/javascript'>
Rico.loadModule('LiveGridAjax','LiveGridMenu','greenHdg.css');
Rico.onLoad( function() {
var buffer = new Rico.Buffer.AjaxXML('/controller/action?format=xml');
var grid_options = { columnSpecs: [,] };
var grid = new Rico.LiveGrid('data_grid', buffer, grid_options);
});
</script>
下記の説明は、Rico LiveGrid プラグインにおける ASP と PHP の実装に直接当てはまります。 概念は .net の同じですが、実装方法は全く異なります (これがどのように .net で実装されるかについては、"ex2simple.aspx" を調べて下さい)。
<%
session.contents("data_grid")="select ID,Name,City from customers"
%>
<? $_SESSION['data_grid']="select ID,Name,City from customers"; ?>
Sub Page_Load(Sender As object, e As EventArgs) data_grid.sqlQuery="select ID,Name,City from customers" ' session variable is set by the control End Sub
<p class="ricoBookmark"><span id="data_grid_bookmark"> </span></p>
<table id="data_grid">
<tr>
<th>Customer #</th>
<th>Customer Name</th>
<th>City</th>
</tr>
</table>
Rico.loadModule('LiveGridAjax','LiveGridMenu','greenHdg.css');
var buffer = new Rico.Buffer.AjaxSQL('ricoXMLquery.asp');
この URL ("ricoXMLquery.asp" の実例で)は、データベースからデータをフェッチして、
この XML フォーマットでグリッドにそれを戻すために、含まれるプラグインの内の 1 つを利用します。
<ajax-response> <response type='object' id='data_grid_updater'> <rows update_ui='true' offset='0'> <tr><td>Data for row 1, cell 1</td><td>Data for row 1, cell 2</td></tr> <tr><td>Data for row 2, cell 1</td><td>Data for row 2, cell 2</td></tr> </rows> <rowcount>99</rowcount> </response> </ajax-response><rowcount> タグはオプションですが、リクエストに "get_total" クエリーストリングパラメータが存在する場合は、 いつでも返されなければなりません。
var grid_options = { columnSpecs: [,,] };
var grid = new Rico.LiveGrid('data_grid', buffer, grid_options);
<script type='text/javascript'>
Rico.loadModule('LiveGridAjax','LiveGridMenu','greenHdg.css');
Rico.onLoad( function() {
var buffer = new Rico.Buffer.AjaxSQL('ricoXMLquery.asp');
var grid_options = { columnSpecs: [,,] };
var grid = new Rico.LiveGrid('data_grid', buffer, grid_options);
});
</script>
このモデルは、 xmlHTTPrequest を利用してデータをフェッチするのでは無く、 javascript コールバック関数を 利用してデータをフェッチする事以外はモデル 3 や 4 と同じ方法で動作します。 これにより、コールバック関数で Google Gears を呼ぶような創造的な事をすることが出来ます。 コールバックをセットアップする事は、非常に簡単です。 データプロバイダの URL の文字列を含むデータを AjaxXML または AjaxSQL コンストラクタに渡すのでは無く、 その代りにコールバック関数を渡すだけです。
以下の AjaxXML バッファを利用するコードは examples/client/gridJSbuffer.html から取得出来ます。 "jsfetch" コールバック関数は 100 行の長さで 5 列の幅の二次元配列を返します。 AjaxXML は、そのバッファを(グリッドのスタートアップで)一度だけロードするので、 jsfetch は一度だけ呼ばれます。 このオプションのハッシュは、Prototype の Ajax.Request メソッドで利用されるオプションのハッシュと構造が同じです。
buffer=new Rico.Buffer.AjaxXML(jsfetch);
function jsfetch(options) {
Rico.writeDebugMsg("jsfetch");
var newRows=[], offset=options.parameters.offset;
for (var r=0; r<100; r++) {
var row=[];
row.push(offset.toString());
row.push(new Date().toString());
for (var c=2; c<5; c++) row.push('cell '+r+':'+c);
newRows.push(row);
}
options.onComplete(newRows);
}
以下の AjaxSQL バッファを利用するコードは examples/client/gridJSbuffer2.html から取得出来ます。
"jsfetch" コールバック関数は、500 行の長さで 5 列の幅の二次元配列をシミュレーションします。
しかし、どんなコールバック中でも、その配列の options.parameters.offset 行から
options.parameters.offset + options.parameters.page_size 行までのセクションが返されます。
buffer=new Rico.Buffer.AjaxSQL(jsfetch);
function jsfetch(options) {
var newRows=[], totrows=500;
var offset=options.parameters.offset;
var limit=Math.min(totrows-offset,options.parameters.page_size)
for (var r=0; r<limit; r++) {
var row=[];
row.push(new Date().toString());
row.push(offset.toString());
for (var c=2; c<5; c++) row.push('cell '+(r+offset)+':'+c);
newRows.push(row);
}
options.onComplete(newRows,false,totrows);
}
options.onComplete は、次のパラメータをとります。
Rico 2.0 はメッセージログにタイムスタンプデバッグメッセージを配達する能力を持っています。 そのログは、HTML のテキストエリアか、ブラウザの javascript コンソールに表示されるでしょう。
<textarea cols="100" rows="5" id="data_grid_debugmsgs" />そして、このテキストエリアがメッセージログのために使われます。
<textarea id='debug' rows='5' cols='80'></textarea>
<script type='text/javascript'>
Rico.setDebugArea('debug');
</script>
Rico LiveGrid は、多くの機能的なビルトインが付属します その機能にアクセスするために、Rico はメニューのデフォルトの設定を含みます -- ricoLiveGridMenu.js で定義されています。 デフォルトメニューを使うために、単に 'LiveGridMenu' モジュールをロードして、 そのグリッドメニュープロパティを Rico.GridMenu クラスのインスタンスに割り当てて下さい。
Rico.loadModule('LiveGridMenu');
...
var ex1=new Rico.LiveGrid ('ex1', buffer, grid_options);
ex1.menu=new Rico.GridMenu();
デフォルトでは、ユーザがグリッドセルをダブルクリックする時メニューが開きます。 メニューを開くイベントを変更するために、グリッドの menuEvent オプションに値を割り当てて下さい。 以下のコードは、右クリックでメニューを開きます。
Rico.loadModule('LiveGridMenu');
...
var grid_options = {
menuEvent: 'contextmenu'
}
var ex1=new Rico.LiveGrid ('ex1', buffer, grid_options);
ex1.menu=new Rico.GridMenu();
Rico.GridMenu は、更なるメニューアイテムを追加するために、コールバック(dataMenuHandler)を提供します。 グリッドメニューは常に動的に構築されます -- ユーザーがクリックした行と列のためにカスタマイズされます。 コールバック関数が毎回呼ばれるように、メニューは起動されて、 それぞれの起動で要求されるメニューアイテムを加えなければなりません。
Rico.loadModule('LiveGridMenu');
...
var ex1=new Rico.LiveGrid ('ex1', buffer, grid_options);
ex1.menu=new Rico.GridMenu();
ex1.menu.options.dataMenuHandler=myCustomMenuItems;
...
function myCustomMenuItems(grid,r,c,onBlankRow) {
if (buffer.getWindowValue(r,c)=='Special Value')
grid.menu.addMenuItem("Special menu item", specialAction);
}
function specialAction() {
...
}
完全なカスタムメニューを作成する事も可能です。 例えば、ex5.php/asp/aspx を見て下さい。
<p class="ricoBookmark"><span id="data_grid_bookmark"> </span></p>
<html> タグの直前に doctype の宣言を含めなければなりません。例えば
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
var grid = new Rico.LiveGrid (table_id, rico_buffer, grid_options);
コンストラクタにオプションでイベントハンドラを渡す事は出来ませんが、LiveGrid が生成された後なら、設定されるかも知れません。
各々の列のためのオプションは、columnSpecs オプションに含まれます。 columnSpecs は、各々の列のためのエントリに関する配列です。 各々の列のエントリは、以下のいずれかで行う事が出来ます。
Rico.TableColumn.DEFAULT = {ClassName:'aligncenter', width:50};
この場合は、仕様の無いどんな列でも、整列は中央で幅は 50 ピクセルの内容を持ちます。
Rico.TableColumn.TEMP = {type:'number', decPlaces:0,
ClassName:'alignright', suffix:'°C', width:50};
var opts = {
frozenColumns : 1,
columnSpecs : [{width:120},{width:70},{width:70},{width:100},
'TEMP','TEMP','TEMP',
{width:150},{width:200},{width:60}]
};
columnSpecs : [{canSort:false, noResize:true, ClassName:'alignright'},
{ClassName:'aligncenter'},
,
{visible:false}]
In CSS:
.mygrid_col0 div.ricoLG_cell,
.mygrid_col1 div.ricoLG_cell,
.mygrid_col2 div.ricoLG_cell {
color: white;
background-color: red;
}
または
In CSS:
.WhiteOnRed div.ricoLG_cell {
color: white;
background-color: red;
}
In javascript:
columnSpecs : [{ClassName:'WhiteOnRed'},
{ClassName:'WhiteOnRed'},
{ClassName:'WhiteOnRed'},
...
最後に、この ClassName がグリッドの見出しに適用されない点に注意してください -
ヘッダの整列を達成するためには、<th> タグで align="right" を利用して下さい。
columnSpecs: [{canHide:false,
control:new Rico.TableColumn.checkbox('1','0'),
ClassName:'aligncenter'},
'specQty'],
var CustId='HANAR';
var CustIdCol=1;
var highlight=Rico.TableColumn.HighlightCell;
...
columnSpecs: [
{ control:new highlight(CustIdCol,CustId,'red','yellow') },
{ control:new highlight(CustIdCol,CustId,'red','yellow') },
{ control:new highlight(CustIdCol,CustId,'red','yellow') },
{ control:new highlight(CustIdCol,CustId,'red','yellow') },
{ control:new highlight(CustIdCol,CustId,'red','yellow') },
{ type:'date', control:new highlight(CustIdCol,CustId,'red','yellow') },
{ type:'date', control:new highlight(CustIdCol,CustId,'red','yellow') }]
columnSpecs: [,
{control:new Rico.TableColumn.link('ex2.asp?id={0}','_blank'),
width:250},
,'specQty']
imgctl=new Rico.TableColumn.image();
...
columnSpecs: [
{control:imgctl,width:90},,,
{type:'datetime'},{width:200}]
// Display values white on black if
// first column contains the value "reverse"
// Usage: { control:new MyCustomColumn() }
MyCustomColumn = Class.create();
MyCustomColumn.prototype = {
initialize: function() {},
_clear: function(gridCell,windowRow) {
gridCell.style.color='';
gridCell.style.backgroundColor='';
gridCell.innerHTML=' ';
},
_display: function(v,gridCell,windowRow) {
var col0=this.liveGrid.buffer.getWindowValue(windowRow,0);
if (col0=="reverse") {
gridCell.style.color='white';
gridCell.style.backgroundColor='black';
} else {
gridCell.style.color='';
gridCell.style.backgroundColor='';
}
gridCell.innerHTML=this._format(v);
}
}
filterUI:'t^20' // will create a text box that is 20 characters wide // text typed into the box will be compared to // the beginning of each column value
数値フォーマット:
日付フォーマット:
// display first column as "month year"
columnSpecs : [{type:date, dateFmt:'mmm yyyy'}]
// indicate that times are GMT/UTC
columnSpecs : [{type:datetime, suffix:' UTC'}]