FX.php + Flexigrid + FileMaker でWeb一覧画面を動的に作成してみる
FlexigridとはPaulo P. Marinas氏が開発・公開しているjQueryプラグインです。非常に簡単なコードを書くだけで、既存のテーブルに対してソートやカラムのサイズ変更といった、さまざまな視覚効果を与えることができます。このライブラリは同サイトにてThe MIT License、GNU GENERAL PUBLIC LICENSE Version 3のデュアルライセンスのもとで公開されています。
FileMakerとPHPを連携させたWebアプリケーションの開発手法としては、FileMaker Pro 9 リリース時に公開されたFileMaker PHP for APIやPHP Site Assistant(正直微妙まだ発展途上のため、これからに期待です)、そしてFX.phpが挙げられますが、ここではFX.phpを利用して、一覧画面を半自動的に生成してみたいと思います。
※ FX.phpにはない独自クラスなどがあります。適宜読み飛ばしてください。
従来の書き方だと
コントローラ$data = new FX_ext(); $data->SetDBData(DATABASE,"test",1); $data->AddDBParam('-skip',$skip); /* ごにょごにょ */ $dataSet=$data->FMFind();
ビューア
<table class="list" cellspacing="0" > <tr> <th>(ヘッダ)</th> </tr> <?php if ($dataSet['foundCount'] > 0) { foreach($dataSet['data'] as $key => $value) { $recid = strtok($key, '.'); ?> <tr> <td class="md"><?= $value['fieldName'][0] ?> </td> </tr> <?php } } ?> </table>
こんな感じでしょうか。一覧画面ですと、このほかにページャやソートなどが実装されているかも知れません。
ではここから手抜きをして、一覧のテンプレートをいちいち作成しなくてもいいようにしたいと思います。具体的には次のとおりです。
- FileMakerレイアウトに配置されているフィールド情報を取得し、自動的に一覧を生成
- 一覧の生成はFlexigridにおこなってもらう
Flexigridは2〜5行のJavaScriptコードを追加するだけで、上記のようなテーブル一覧にもすぐに組み込むことができますが、せっかくですのでソートやページャ・簡易検索といった強力な機能を使用できる実装にします。データのやり取りはXMLとJSONがサポートされています。ここではJSONを選択しました。
修正後のコード
コントローラ$postdata = sanitizeTag($_POST); if ( 'list_json' == $mode) { $sortname = ( $postdata['sortname'] ) ? $postdata['sortname'] : 'serial'; $sortorder = ( $postdata['sortorder'] ) ? $postdata['sortorder'] : 'descend'; $max= ( $postdata['rp'] ) ? $postdata['rp'] : 15 ; $page = ( $postdata['page'] ) ? $postdata['page'] - 0 : 1 ; switch($sortorder) { case 'desc': $sortorder = 'descend'; break; case 'asc': $sortorder = 'ascend'; break; default: $sortorder = 'descend'; break; } $data = new FX_ext(); $data->SetDBData(DATABASE,"test",$max); $data->AddSortParam($sortname, $sortorder ,1); $data->AddDBParam('-skip',$max*($page-1)); if ($postdata['qtype'] && $postdata['query'] ) { $data->AddDBParam($postdata['qtype'],$postdata['query']); } $dataSet=$data->FMFind(); $json = array ( 'page' => $page, 'total' => $dataSet['foundCount'], ); foreach($dataSet['data'] as $key => $value) { $recid = strtok($key, '.'); unset($tmp); $tmp[] = $recid; foreach($dataSet['fields'] as $fKey => $fValue) { $tmp[] = printFormat($value[$fValue['name']][0], $fValue['type']).($postdata['serial']); } $json['rows'][] = ( array ( 'id' => $recid, 'cell' => $tmp ) ); } $output = json_encode($json); echo $output."\n"; }
配列でのフィールド定義
// フィールド名のラベルを設定 $fieldName2Label_array = array ( // フィールド名 => 日本語ラベル(タグOK) 'text_field' => 'テキスト', 'date_field' => '日付', 'serial' => 'シリアル' );
ビューア(JavaScript)
<script type="text/javascript" src="./js/jquery-1.2.3.js"></script> <script type="text/javascript" src="./js/flexigrid.js"></script> <script type="text/javascript"> <!-- $(document).ready(function() { $("#list").flexigrid ( { url: './hoge.php?mode=list_json', procmsg: '読み込んでいます。しばらくお待ちください..', pagestat: '{total} 件中、{from} - {to} 件目を表示', dataType: 'json', colModel : [ {display: '#', name : 'recid', width: 70, sortable : true, align: 'center' }, <?php $n = 0; foreach($dataSet['fields'] as $fKey => $fValue) { if (0 < $n) { echo ",\n"; } ?> {display: '<?= printLabel($fieldName2Label_array, $fValue['name']) ?>', name : '<?= $fValue['name'] ?>', width:100, sortable : true, align: '<?= printAlign($listDisplayAlign_array, $value[$fValue['name']][0], $fValue['type'], 'none') ?>'} <?php $n++; } unset($fKey,$fValue); ?> ], searchitems : [ <?php $n = 0; foreach($dataSet['fields'] as $fKey => $fValue) { if (0 < $n) { echo ",\n"; } ?> {display: '<?= printLabel($fieldName2Label_array, $fValue['name']) ?>', name : '<?= $fValue['name'] ?>'} <?php $n++; } unset($fKey,$fValue); ?> ], sortname: 'recid', sortorder: 'desc', usepager: true, useRp: true, rp: 15, width: 'auto', height: 'auto' } ); } ); --> </script>
ビューア(HTML)
<table id="list" style="display:none"></table>
実行結果
JavaScriptにPHPコードを突っ込んでいたり、JSONの出力方法がまだまだきれいになりそうですが、とりあえずFileMakerレイアウトに配置されているフィールド情報をもとに、テーブルを組むこと(?)なく一覧画面が自動作成できました。