Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
Ext.Direct と xFrameworkPX のコラボ
さて,Ext.Direct を xFrameworkPX で使うというところにやっとたどりついた。
前回の資料で
- xFrameworkPXにはxFrameworkPX_Controller_ExtDirectクラスが存在する。
- モジュールを作成して、コントローラーに登録するだけでモジュール名でJS側からアクセスできる。
- サーバーサイドのやりとり(api.phpとかrouter.phpの部分)は、ちゃんとオリジナルで実装して動作確認済。
- MVCのModel部分をExt側から透過的に利用できるため、開発が高速。
というのがありました。xFrameworkPX_Controller_ExtDirect を継承したコントローラーを使うと,「モジュール名でアクセスできる」ってことですね。モジュールに必要なメソッドを書いてやれば,それをExt.Directで使えるという訳です。ぐっとハードルが低くなります。
「これはすばらしい」と思っているわけですが,そのxFrameworkPX_Controller_ExtDirectに関する資料がみつからない。
小堤さんのブログで「xFrameworkPX_Controller_ExtDirect」という記事を発見。
これじゃ,これじゃがな。(ただこれは,xFrameworkPX 3.5 をリリースする前に出された記事のようです。)
ブログの記事には,コントローラーコード,モジュールコード,JSコードが載ってます。なるほど,ふむふむという感じなのですが,
<!-- Ext Direct API --> <script type="text/javascript" src="api.php"></script> <!-- /Ext Direct API -->
上記のような部分をどう書いたらいいのかわからない。apiの指定とか,routerの指定はどうなるのだろう。とかいろいろと思う。
試しにサンプルのコードを配置してアクセスしてみた。すると
eval(Ext.app.REMOTING_API = {"url":"extdirect.html","type":"remoting","actions":[]});
というのが返ってくる。きっとこれがAPIだ。(ちゃんと中身がないのが気になるが,なにか間違ってるんだ,それは後でしらべよう)
それから,xFrameworkPX_Controller_ExtDirectクラスのソースコードを眺めたりしていて,POSTパラメータがない場合は,api.php の戻り値みたいなのを返して,POSTパラメータがある場合はrouterとなるような感じ。ということは,Ext.Directを使うときには,きっと
<!-- Ext Direct API --> <script type="text/javascript" src="extdirect.html"></script> <!-- /Ext Direct API -->
のように書くに違いない。で,htmlファイルには上記のように書いて,コントローラーのファイル名を .extdirect.php として保存した。
そうすれば,extdirect.html としてアクセスできるから。また,APIの中身がなかったのは,コントローラーのコードがちょっと違っているためだったようなので,そこも修正。
そうしたらうまく動いた!これは大きな一歩を踏み出したぞ!次が実際に動かしたソース
コントローラー .extdirect.php
<?php
class extdirect extends xFrameworkPX_Controller_ExtDirect {
public $modules = array(
'TreePanel' => array(
// {{{ コネクション名設定
'conn' => 'default'
// }}}
)
);
}
モジュール treePanel.php
<?php
class TreePanel extends xFrameworkPX_Model {
public function getTree( $id ) {
$out = array();
if($id == "root"){
for($i = 1; $i <= 5; ++$i){
array_push($out, array(
'id'=>'n' . $i,
'text'=>'Node ' . $i,
'leaf'=>false
));
}
}else if(strlen($id) == 2){
$num = substr($id, 1);
for($i = 1; $i <= 5; ++$i){
array_push($out, array(
'id'=>$id . $i,
'text'=>'Node ' . $num . '.' . $i,
'leaf'=>true
));
}
}
return $out;
}
}
JavaScript
/**
*
*/
Ext.onReady( function() {
Ext.Direct.addProvider(Ext.app.REMOTING_API);
var tree = new Ext.tree.TreePanel({
width: 400,
height: 400,
autoScroll: true,
renderTo: Ext.getBody(),
root: {
id: 'root',
text: 'Root'
},
loader: new Ext.tree.TreeLoader({
directFn: TreePanel.getTree
}),
fbar: [{
text: 'Reload root',
handler: function(){
tree.getRootNode().reload();
}
}]
});
});
宿題
- コントローラーの名前はextdirectでなくてはならんのだろうか。別にそれでもいいんだけど。
- 小堤さんから,ツイートで教えてもらった。次の件,どういうことなのか調べる
ちなみに、フォームパネルとの連携の際、formHandler=trueをAPIで帰す必要がありますが、xFrameworkPXの場合、メソッドのコメントに@formHandlerかけば勝手になります。参考までにー。
