ExtJS + eXist で動的に ColumnModel

Ext はとてもいい look & feel なんだけど,論理構造に RDB 的なのを要求するのが難点.
たとえば ColumnModel をデータベースから生成しようとするとめんどくさい.
本当は ColumnModelStore かなんかを実装して,
その load イベントで Grid を生成するのがいいのかもしれないけど,
実際には RecordModel も自動生成する必要があって,やっぱりめんどくさい.
ということで,鯖側の XQueryJSON を生成して,ブラウザに読み込ませるようにしてみた.

(: column-models.xql :)
declare function gen-json-column-model()
{
    let $lbr := "[", $rbr := "]", $lbc := "{", $rbc := "}"
    return
        <json>{$lbc}{string-join((
            for $x in document('hoge.xml')/column-models/column-model
            return
                <json>"{data($x/@id)}": {$lbr}{string-join((
                    for $y in $x/columns/column
                    return <json>{$lbc}id: "data($y/@id)", name: "data($y/@name)"{$rbc}</json>
                ), ', ')}{$rbr}</json>
        ), ', ')}{$rbc}</json>
};

response:set-header('Content-Type', 'text/javascript'),
("ColumnModels = "),
data(gen-json-column-model()),
(";")
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; CharSet=UTF-8" />
        <script type="text/javascript" src="column-models.xql"></script>
        <script type="text/javascript">
alert(ColumnModels);
        </script>
    </head>
    <body>
    </body>
</html>

あとはこのColumnModels から適宜 Ext の ColumnModel とか RecordModel とかを生成する.


…なんという bad hack.しんじゃえばいいよ.