FX.php + Flexigrid + FileMaker でWeb一覧画面を動的に作成してみる

FlexigridとはPaulo P. Marinas氏が開発・公開しているjQueryプラグインです。非常に簡単なコードを書くだけで、既存のテーブルに対してソートやカラムのサイズ変更といった、さまざまな視覚効果を与えることができます。このライブラリは同サイトにてThe MIT License、GNU GENERAL PUBLIC LICENSE Version 3のデュアルライセンスのもとで公開されています。

FileMakerPHPを連携させたWebアプリケーションの開発手法としては、FileMaker Pro 9 リリース時に公開されたFileMaker PHP for APIPHP 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] ?>&nbsp;</td>
            </tr>
            <?php
        }
    }
    ?>
</table>

こんな感じでしょうか。一覧画面ですと、このほかにページャやソートなどが実装されているかも知れません。

ではここから手抜きをして、一覧のテンプレートをいちいち作成しなくてもいいようにしたいと思います。具体的には次のとおりです。

  • FileMakerレイアウトに配置されているフィールド情報を取得し、自動的に一覧を生成
    • 一覧画面に表示したくない場合はphp側で専用の配列を定義しておく
    • フィールド名/表示用のラベルを変更したい場合もphp側で専用の配列を定義
  • 一覧の生成はFlexigridにおこなってもらう

Flexigridは2〜5行のJavaScriptコードを追加するだけで、上記のようなテーブル一覧にもすぐに組み込むことができますが、せっかくですのでソートやページャ・簡易検索といった強力な機能を使用できる実装にします。データのやり取りはXMLJSONがサポートされています。ここでは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>


実行結果



JavaScriptPHPコードを突っ込んでいたり、JSONの出力方法がまだまだきれいになりそうですが、とりあえずFileMakerレイアウトに配置されているフィールド情報をもとに、テーブルを組むこと(?)なく一覧画面が自動作成できました。

CRUDまで行なえるスケルトンの自動作成が目標ですが、できるのかな・・完成したら公開します。