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