LoginSignup
2
0

More than 1 year has passed since last update.

w2ui(grid)のデータソースとしてSeaside(Pharo)を使う

Last updated at Posted at 2021-10-19

はじめに

w2uiのgridはスクロールに伴いオンデマンドでサーバーからデータを取得することで無限スクロールを可能とするグリッドライブラリです。
ここでは、w2ui(grid)のデータソースとしてSeaside(Pharo)を使うサンプルを紹介します。

動作した環境

項目 内容
サーバー Pharo8.0.0+seaside3
クライアント Google Chrome
javascriptライブラリ w2ui 1.5

ソースコード

※稼働中のプログラムの一部をコピペしただけで、このサンプルが動作するかの検証は行っていません。

javascript

javascriptサンプル
$(function() {
    $("#grid").w2grid({
        name: "grid",
        limit:  50,
        url: "dummy",
        recid: "id",
        columns: [
            { field: "id", text: "id", size: "40px", hidden: true },
            { field: "お名前", text: "お名前", size: "100px", sortable: true }
        ],
        onRequest: function(event) {
            const data = eval('(' + document.getElementById("data").innerHTML + ')');
            event.url = document.getElementById("url").innerHTML + '?' + data.replace(/&/g, "&");
        }
    });
});
  • limitプロパティで1回あたりにサーバーから取得するレコード数を指定しています
  • w2gridがサーバーにデータをリクエストする直前にonRequestイベントが発火するので、そこでリクエスト先のURLを上書きしています。
  • リクエスト先URLはPharo側でspan要素にセットされた情報を元に生成します

Pharo

htmlレンダリング

renderContentOnメソッド
renderContentOn: html
    | req |
    html div style:'display:none;'; with:[
        req := html jQuery ajax callback:[
            | param |
            param := NeoJSONReader fromString: (self requestContext request fields at: 'request').
            self createResponse: (
                self getList: param
            ) contentType: 'application/xml'.
        ].
        html span id:'url'; with: (req options at:'url').
        html span id:'data'; with: (req options at:'data').
    ].
    html div id:'grid'; style:'width: 1200px; height: 500px; margin-top: -1px;'.
  • jQuery ajax callback:[]でリクエスト先のコールバックを定義しています
  • コールバックオブジェクトからリクエスト先URLの情報を取得して、idがdataとurlというspan要素にその情報をセットしています
  • requestContextからリクエストパラメータを抽出して変数parmにセットしています
  • createResponseがクライアントに検索結果を返します(getListメソッドが検索を実行)

検索実行

getList: param
    | total records |
    "ここにSQLサーバーからレコードを取得するコードを書きます"
    "変数paramにはw2gridから送られてきた検索条件が入っています"
    "(SQL文の例)'SELECT id,お名前 FROM hoge LIMIT ', (param at: 'limit') asString , ' OFFSET ',(param at: 'offset') asString"
    ^ NeoJSONWriter toString: 
        (Dictionary new
            at: 'status' put: 'success';
            at: 'total' put: total;
            at: 'records' put: records;
            yourself
        )
  • 変数totalには検索にヒットしたレコード数をセットします
  • 変数recordsには今回クライアントに返すレコードの配列をセットします
  • レコード取得部分は省略します

ライブラリの読み込み

updateRoot: anHtmlRoot
    super updateRoot: anHtmlRoot.   
    anHtmlRoot beHtml5.
    anHtmlRoot stylesheet url: 'path/to/css/w2ui-1.5.min.css'.
    anHtmlRoot javascript url: 'path/to/libs/jquery3.5.1.min.js'.
    anHtmlRoot javascript url: 'path/to/libs/w2ui-1.5.min.js'.

まとめ

w2uiを使えば、たったこれだけの少ないコード記述でグリッドを使ったWEBアプリの作成が可能であることがわかっていただけると思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0