ushidayの日記

主に「IBMi」のメモに・・・

SigmaGridを使ってみた(その3)

SigmaGridには、サーバーサイドページングとサーバーサイドソーティングの機能もあるので、そっちを使ってみました。今回はページングです。

サーバーサイドページング

gridオプションの「remotePaging」を”true”にします。PHPのサンプルは”デモディレクトリ/export_php/testRemotePaging.php”に入ってるので、それを参考にします。
サーバーサイドページングのカラクリは、MySQLで言うところの”offset limit”を使って必要なレコードを取得するというやり方と、全件取得したレコードセットを”array_sliceで切出す”の2パターンありそうです。但し、DB2は前述の様な”offset limit”に該当するものがないので"rownumber() over "を使い自前でオフセットする必要があります。
巨大トランザクションを相手にページングするわけでもないので、とりあえず実装が単純な”array_slice”でページングします。(デモサンプルはこっち)以前からの流れで、Zend MVCを使っているので、JSONレスポンスもZend Controllerに任せる形で、以下の様なアクションを追加します。

■アクションコントローラのメソッド

<?php
require_once 'Zend/Controller/Action.php';
require_once 'dao/SearchModel.php';

//ユーティリティのインクルード
require_once('GridServerHandler.php');

class OrderController extends Zend_Controller_Action{
    public function getjsonAction()
    {
    $gridHandler = new GridServerHandler();

    //サンプルには記載されているが、未定義エラーになる。
    //$type = getParameter('exportType');

    //開始行
    $start = $gridHandler->pageInfo["startRowNum"] - 1;
    //1ページあたりの表示行数
    $pageSize = $gridHandler->pageInfo["pageSize"];
    
    $model = new SearchModel();       //DAO
    $result = $model->getList();      //データ取得
    $rows = $result["data"];
    
    // ページング
    $data = array_slice($rows, $start, $pageSize);
    
    //ハンドラーに渡す。
    header('Content-type:text/javascript;charset=UTF-8');
    $gridHandler->setData($data);
    $gridHandler->setTotalRowNum(count($rows));
    $gridHandler->printLoadResponseText();
        
    }
}
?>

”GridServerHandler”ですが、これはSigmaGridのサンプルの中(export_phpディレクトリ)にあります。SigmaGridとプログラム間でのやり取りを簡略化してくれるユーティリティクラスで、引数の受け取りや、データを渡す際にJSONへの変換を提供してくれます。これを使うためには、必要なユーティリティを”include_path”に通しておくか、プロジェクトの”library”に配置しておく必要があります。
サンプルには記載がある「getParameter('exportType');」のステップは未定義でエラーになりました。エクセルやPDFへのエクスポートも出来るので、そっちで関係有るのかと...。
$gridHandler->pageInfo[名前]で、SigmaGridの現在のステータスを取得出来ます。これは「$_POST["_gt_json"]」でPOSTされた引数をGridハンドラーのプロパティとしてラップしてあります。開始行(startRowNum)と1ページあたりの行数(pageSize)プロパティを取得して、”array_slice”で切り出します。
setDataメソッドで切り出した連想配列とsetTotalRowNumメソッドで合計のレコード件数を渡して、レスポンス(printLoadResponseText)すれば、ページング完了です。

Zend Projectでサービスって

Zend MVC で使うときは、コントローラーアクションと同名のダミーのViewが必要なのか?(CoCで考えれば当たり前に必要かとも..)Viewが無くても出来るのかは?まだZend MVCを深く掘り下げていないので、わかりませんでした。
とりあえず、Viewがないとエラーになったのでダミーのビューを作りましたが、むしろこれはMVCでは無くて、サービスだと思いますが、Zend Projectのapplicationにサービスと定義されたディレクトリは無いので、パブリックなディレクトリに適当に作るのが一般的なのか?どういう流儀なのかは、正直よくわかっておりません。