SlideShare a Scribd company logo
1 of 19
Ext.Direct入門
自己紹介 小堤 一弘(こつつみ かずひろ) 株式会社ゼノフィhttp://www.xenophy.com/ Ext Japanhttp://extjs.co.jp/ code:xhttp://code.xenophy.com/ xFrameworkPXhttp://www.xframeworkpx.com/
本日のアジェンダ Ext.Directって何? Ext.Direct Packの準備 基本的なRPCの使い方 Ext.tree.TreePanelとの連携 Ext.grid.GridPanelとの連携 Ext.form.FormPanelとの連携 http://extdirect.xenophy.net/directsample.zip
Ext.Directって何? RPC(Remote Procedure Call、リモートプロシージャコール)が行える便利な機能 サーバー通信は、Ext.Ajaxを利用するか、Ext.data.Store経由での通信のみで、サーバー処理との連動は以外とコストがかかる。 Ext.Directを使うとサーバーサイドの関数をJavaScriptの関数のように呼び出すことができて、可読性もよい。 Ext.Directを使うためには、Ext.Direct Packを使うかサーバーサイドを自分で実装する必要がある。
Ext.Direct Packの準備 http://www.extjs.com/products/extjs/download.phpから【Ext.Direct Pack】をダウンロードする。 利用したい言語のインタフェースを設置する。 いつもどおり、とりあえずExt JSを使用するためのHTMLとExt.onReadyを記述したJSコードを準備する。 APIを定義する これでだけで準備は完了!
Ext.Direct Packの準備 - HTML <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <!-- head --> <head>     <!-- content-type -->     <meta http-equiv="content-type" content="text/html; charset=utf-8" />     <meta http-equiv="content-script-Type" content="text/javascript" />     <meta http-equiv="content-style-type" content="text/css" />     <!-- /content-type -->     <!-- Title -->     <title>Ext.Direct</title>     <!-- /Title -->     <!-- Ext JS -->     <link rel="stylesheet" type="text/css" href="./extjs/resources/css/ext-all.css" />     <!-- /Ext JS --> </head> <!-- /head --> <!-- body --> <body>     <!-- Ext JS -->     <script type="text/javascript" src="./extjs/adapter/ext/ext-base.js"></script>     <script type="text/javascript" src="./extjs/ext-all.js"></script>     <script type="text/javascript" src="./extjs/src/locale/ext-lang-ja.js"></script>     <!-- /Ext JS -->     <!-- Application -->     <script type="text/javascript" src="./sample1.js"></script>     <!-- /Application --> </body> <!-- /body --> </html>
Ext.Direct Packの準備 – JSコード Ext.onReady(function(){     alert('Ext.Direct入門'); });
基本的なRPCの使い方 APIを設定する 上記のapi.phpで何が行われているか? Ext.Directプロバイダ追加 classes/Echo.phpのsendをJSから呼び出す。 <!-- Ext Direct API --> <script type="text/javascript" src="api.php"></script> <!-- /Ext Direct API --> Ext.ns('Ext.ss'); Ext.ss.APIDesc = {"url":"router.php","type":"remoting","actions":{"Echo":[{"name":"send","len":1}],"Exception":[{"name":"makeError","len":0}],"Time":[{"name":"get","len":0}],"File":[{"name":"list","len":1,"serverMethod":"listFiles"},{"name":"add","len":2,"formHandler":true}]},"namespace":"Ext.ss"}; Ext.Direct.addProvider(Ext.ss.APIDesc); // sendメソッドコール Ext.ss.Echo.send('Ext.Direct Sample2!');
基本的なRPCの使い方 コールバックを利用する サーバーサイド側のメソッド引数をプロバイダ追加時に定義しているため、同様の引数で呼び出すことができる。 サーバーサイド側のメソッド引数以降は、コールバック関数を設定することができ、その次にスコープを設定できる。 コールバックの引数は、サーバーサイドが返した値になる、PHPの場合配列で返却すると、JS側でも配列になる。 // sendメソッドコール Ext.ss.Echo.send('Ext.Direct Sample3!', function(ret) {         alert(ret);     }, this);
Ext.tree.TreePanelとの連携 ツリーローダーをExt.Directで通信させる。 サーバーサイド側で引数(node-id)に応じてツリー配列を返却すればOK! api.phpにTreeクラスを追加する loader: new Ext.tree.TreeLoader({ directFn: TreePanel.getTree }), $api->add(     array(         'Tree' => array('prefix' => 'Class_'),         'Echo' => array('prefix' => 'Class_'),         'Exception' => array('prefix' => 'Class_'),         'Time',         'File'     ) );
Ext.tree.TreePanelとの連携 Treeクラスを作る。 <?php     class Class_Tree {         /**          * @remotable          */         public function get($id){             $ret = array();             if ($id==='root') {                 $ret[] = array(                     'id' => 'node1',                     'text' => 'ノード1'                 );                 $ret[] = array(                     'id' => 'node2',                     'text' => 'ノード2'                 );             } else {                 $ret[] = array(                     'id' => 'leaf1',                     'text' => 'リーフ1',                     'leaf' => true                 );                 $ret[] = array(                     'id' => 'leaf2',                     'text' => 'リーフ2',                     'leaf' => true                 );             }             return $ret;         }     } ?>
Ext.tree.TreePanelとの連携 Ext.tree.TreePanelを生成する。 var tree = new Ext.tree.TreePanel({ autoScroll: true,     root: {         id: 'root',         text: 'Root'     },     width: 300,     height: 500,     loader: new Ext.tree.TreeLoader({ directFn: Ext.ss.Tree.get     }), renderTo: Ext.getBody() });
Ext.grid.GridPanelとの連携 Ext.data.DirectStoreを使ったグリッドを作成する。 api.phpに追加する var grid = new Ext.grid.GridPanel({     title: 'Ext.Direct for Ext.grid.GridPanel',     store: new Ext.data.DirectStore({ autoLoad: true, paramsAsHash: false, directFn: Ext.ss.Grid.getAll,  root: 'users',         fields: [             { name: 'id', mapping: 'id' },             { name: 'name', mapping: 'name' },             { name: 'email', mapping: 'email' }         ]     }),     columns : [       { header: '名前', width: 160, sortable: true, dataIndex: 'name' },       { header: 'メールアドレス', width: 300, sortable: true, dataIndex: 'email' },     ], autoScroll: true,     height: 300, renderTo: Ext.getBody() }); 'Grid' => array('prefix' => 'Class_'),
Ext.grid.GridPanelとの連携 Grid.phpを作成する。 <?php     class Class_Grid {         /**          * @remotable          */         public function getAll(){             $ret = array();             $users = array();             $users[] = array(                 'id' => '1',                 'name' => '小堤 一弘',                 'email' => 'kotsutsumi@xenophy.com'             );             $users[] = array(                 'id' => '2',                 'name' => '斎藤 貴樹',                 'email' => 'saito@xenophy.com'             );             $users[] = array(                 'id' => '3',                 'name' => '安永 一博',                 'email' => 'yasunaga@xenophy.com'             );             $ret['total'] = count($users);             $ret['users'] = $users;             return $ret;         }     } ?>
Ext.form.FormPanelとの連携 apiを指定して、Ext.Directを利用する。 varbasicInfo = new Ext.form.FormPanel({     title: 'ユーザー情報',     padding: 10,     buttons:[{         text: 'Submit',         handler: function(){ basicInfo.getForm().submit({ params: { foo: 'bar', uid: 34                 }             });         }     }],     defaults: {anchor: '-20'}, defaultType: 'textfield',     items: [{ fieldLabel: 'Name',         name: 'name'     },{ fieldLabel: 'Email', msgTarget: 'side',         name: 'email'     },{ fieldLabel: 'Company',         name: 'company'     }], api: {         load: Ext.ss.Form.getBasicInfo,         submit: Ext.ss.Form2.updateBasicInfo     }, paramOrder: ['uid', 'foo'],     width: 500,     height: 180, renderTo: Ext.getBody() }); basicInfo.getForm().load({ params: { foo: 'bar', uid: 34      } });
Ext.form.FormPanelとの連携 サーバーサイドのクラスを準備する。 <?php     class Class_Form {         /**          * @remotable          */         function getBasicInfo($userId, $foo){             return array(                 'success'=>true,                 'data'=>array(                     'name'=>'Kazuhiro Kotsutsumi',                     'company'=>'Xenophy',                     'email'=>'kotsutsumi@xenophy.com'                  )             );         }     } ?> <?php     class Class_Form2 {         /**          * @remotable          */         function updateBasicInfo($formPacket){             $response = array();             $response['errors'] = array(                 'email'=>'kotsutsumi@xenophy.comを入力してください。'             );             $response['success'] = false;             return $response;         }     } ?>
まとめ サーバーサイドのやりとりが非常に便利になる。 感覚的にサーバーサイドへJSコードでアクセスできる。 だけど・・・ サンプルに入っているExt.Directの書き方が若干違ったり(api.phpとか)するし、APIの生成(JSON)がおかしかったりする・・・。 Symphonyなどのフレームワーク用のExt.Direct用のクラスも配布されている。 なんだかんだ、ちゃんと作る前にサーバーサイドのインタフェースの作りはちゃんと理解しておく必要がある。
手前味噌ですが・・ xFrameworkPXにはxFrameworkPX_Controller_ExtDirectクラスが存在する。 モジュールを作成して、コントローラーに登録するだけでモジュール名でJS側からアクセスできる。 サーバーサイドのやりとり(api.phpとかrouter.phpの部分)は、ちゃんとオリジナルで実装して動作確認済。 MVCのModel部分をExt側から透過的に利用できるため、開発が高速。 なんていう宣伝。
時間があまったら JSコードの隠蔽化 Googleクロージャーツール http://closure-compiler.appspot.com/home Amateta SWF ENCRYPT http://www.amayeta.com/software/swfencrypt/ Motion Decompiler SWFのタイムラインにJSコードを埋め込んで、実行する。SWFが暗号化されているため、デコンパイルしてもJSコードを抽出できない

More Related Content

What's hot

WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法regret raym
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hashhigaki
 
これからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようこれからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようHishikawa Takuro
 
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
CakePHPで開発する時に統一しておきたいコーディング内容(080316)CakePHPで開発する時に統一しておきたいコーディング内容(080316)
CakePHPで開発する時に統一しておきたいコーディング内容(080316)柴田 篤志
 
JavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRubyJavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRubyHiroshi Nakamura
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようShinsuke Sugaya
 
Geolocation gurunavi
Geolocation gurunaviGeolocation gurunavi
Geolocation gurunaviJun Chiba
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
拡張ライブラリ作成による高速化
拡張ライブラリ作成による高速化拡張ライブラリ作成による高速化
拡張ライブラリ作成による高速化Kazunori Jo
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方Soudai Sone
 

What's hot (14)

WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hash
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
これからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようこれからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしよう
 
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
CakePHPで開発する時に統一しておきたいコーディング内容(080316)CakePHPで開発する時に統一しておきたいコーディング内容(080316)
CakePHPで開発する時に統一しておきたいコーディング内容(080316)
 
JavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRubyJavaOne Tokyo JVM言語BOF ベンチマーク JRuby
JavaOne Tokyo JVM言語BOF ベンチマーク JRuby
 
Tokyor36
Tokyor36Tokyor36
Tokyor36
 
Tokyo r28 1
Tokyo r28 1Tokyo r28 1
Tokyo r28 1
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
 
真・聴力検査 HACKS
真・聴力検査 HACKS真・聴力検査 HACKS
真・聴力検査 HACKS
 
Geolocation gurunavi
Geolocation gurunaviGeolocation gurunavi
Geolocation gurunavi
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
拡張ライブラリ作成による高速化
拡張ライブラリ作成による高速化拡張ライブラリ作成による高速化
拡張ライブラリ作成による高速化
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 

Viewers also liked

100915 HTML5とか勉強会発表資料
100915 HTML5とか勉強会発表資料100915 HTML5とか勉強会発表資料
100915 HTML5とか勉強会発表資料Yuki Naotori
 
SpreadOfficeとSencha Touch
SpreadOfficeとSencha TouchSpreadOfficeとSencha Touch
SpreadOfficeとSencha TouchYuki Naotori
 
Sencha touchのはじめかた
Sencha touchのはじめかたSencha touchのはじめかた
Sencha touchのはじめかたYuki Naotori
 
101125 sencha con2010報告
101125 sencha con2010報告101125 sencha con2010報告
101125 sencha con2010報告Yuki Naotori
 
120611 html5とか勉強会 st2
120611 html5とか勉強会 st2120611 html5とか勉強会 st2
120611 html5とか勉強会 st2Yuki Naotori
 
HTML5ビデオ導入編
HTML5ビデオ導入編HTML5ビデオ導入編
HTML5ビデオ導入編Yuki Naotori
 

Viewers also liked (8)

100915 HTML5とか勉強会発表資料
100915 HTML5とか勉強会発表資料100915 HTML5とか勉強会発表資料
100915 HTML5とか勉強会発表資料
 
SpreadOfficeとSencha Touch
SpreadOfficeとSencha TouchSpreadOfficeとSencha Touch
SpreadOfficeとSencha Touch
 
Sencha touchのはじめかた
Sencha touchのはじめかたSencha touchのはじめかた
Sencha touchのはじめかた
 
Initial plans
Initial plansInitial plans
Initial plans
 
101125 sencha con2010報告
101125 sencha con2010報告101125 sencha con2010報告
101125 sencha con2010報告
 
120611 html5とか勉強会 st2
120611 html5とか勉強会 st2120611 html5とか勉強会 st2
120611 html5とか勉強会 st2
 
End of native?
End of native?End of native?
End of native?
 
HTML5ビデオ導入編
HTML5ビデオ導入編HTML5ビデオ導入編
HTML5ビデオ導入編
 

Similar to Ext.Directについて

T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日Go Tanaka
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013純生 野田
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
本当は怖いPHP
本当は怖いPHP本当は怖いPHP
本当は怖いPHPTakuya Sato
 
Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...
Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...
Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...AdNerds
 
Cake php4designers
Cake php4designersCake php4designers
Cake php4designersSeiji Ogawa
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数Wataru Terada
 
Fblinkedinbeyondv01 1234514863232782 1
Fblinkedinbeyondv01 1234514863232782 1Fblinkedinbeyondv01 1234514863232782 1
Fblinkedinbeyondv01 1234514863232782 1guestcaceba
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!文樹 高橋
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件Kazuki MATSUMOTO
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012Yusuke Ando
 
webを飾る技術
webを飾る技術webを飾る技術
webを飾る技術ina job
 
CakePHP Kansai 2008-12-12
CakePHP Kansai 2008-12-12CakePHP Kansai 2008-12-12
CakePHP Kansai 2008-12-12Yasuo Harada
 

Similar to Ext.Directについて (20)

T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
 
MT meets PHP
MT meets PHPMT meets PHP
MT meets PHP
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
本当は怖いPHP
本当は怖いPHP本当は怖いPHP
本当は怖いPHP
 
Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...
Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...
Facebook, LinkedIN & Beyond - or how the new media changed how sales people d...
 
Cake php4designers
Cake php4designersCake php4designers
Cake php4designers
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
Fblinkedinbeyondv01 1234514863232782 1
Fblinkedinbeyondv01 1234514863232782 1Fblinkedinbeyondv01 1234514863232782 1
Fblinkedinbeyondv01 1234514863232782 1
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道20123時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
 
webを飾る技術
webを飾る技術webを飾る技術
webを飾る技術
 
Boost tour 1_44_0
Boost tour 1_44_0Boost tour 1_44_0
Boost tour 1_44_0
 
CakePHP Kansai 2008-12-12
CakePHP Kansai 2008-12-12CakePHP Kansai 2008-12-12
CakePHP Kansai 2008-12-12
 

More from Yuki Naotori

Sencha touch とyubizo engineで作るネイティブアプリ
Sencha touch とyubizo engineで作るネイティブアプリSencha touch とyubizo engineで作るネイティブアプリ
Sencha touch とyubizo engineで作るネイティブアプリYuki Naotori
 
Ext Designerについて
Ext DesignerについてExt Designerについて
Ext DesignerについてYuki Naotori
 
Ext Direct 入門 II
Ext Direct 入門 IIExt Direct 入門 II
Ext Direct 入門 IIYuki Naotori
 
Ext.util.Observableについて
Ext.util.ObservableについてExt.util.Observableについて
Ext.util.ObservableについてYuki Naotori
 
Ext Jsで柔軟に開発仕事をこなす
Ext Jsで柔軟に開発仕事をこなすExt Jsで柔軟に開発仕事をこなす
Ext Jsで柔軟に開発仕事をこなすYuki Naotori
 
ExtJS 事例  2ちゃんビューアー「Cromartie49」
ExtJS 事例  2ちゃんビューアー「Cromartie49」ExtJS 事例  2ちゃんビューアー「Cromartie49」
ExtJS 事例  2ちゃんビューアー「Cromartie49」Yuki Naotori
 
090422 第10回勉強会(公開用)
090422 第10回勉強会(公開用)090422 第10回勉強会(公開用)
090422 第10回勉強会(公開用)Yuki Naotori
 
Prototyping tool "Degino"
Prototyping tool "Degino"Prototyping tool "Degino"
Prototyping tool "Degino"Yuki Naotori
 
第9回勉強会 開発の基本
第9回勉強会 開発の基本第9回勉強会 開発の基本
第9回勉強会 開発の基本Yuki Naotori
 
第9回勉強会(Ext3.0について)
第9回勉強会(Ext3.0について)第9回勉強会(Ext3.0について)
第9回勉強会(Ext3.0について)Yuki Naotori
 
第8回Ext勉強会プレゼン - 石丸
第8回Ext勉強会プレゼン - 石丸第8回Ext勉強会プレゼン - 石丸
第8回Ext勉強会プレゼン - 石丸Yuki Naotori
 
第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料
第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料
第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料Yuki Naotori
 
Google Web Toolkit(GWT)入門
Google Web Toolkit(GWT)入門Google Web Toolkit(GWT)入門
Google Web Toolkit(GWT)入門Yuki Naotori
 
外部ライブラリのExt.Component化
外部ライブラリのExt.Component化外部ライブラリのExt.Component化
外部ライブラリのExt.Component化Yuki Naotori
 
株式会社テンダ Ext Js
株式会社テンダ Ext Js株式会社テンダ Ext Js
株式会社テンダ Ext JsYuki Naotori
 
080924 Ext Js入門者の最初の壁(第4回勉強会)
080924 Ext Js入門者の最初の壁(第4回勉強会)080924 Ext Js入門者の最初の壁(第4回勉強会)
080924 Ext Js入門者の最初の壁(第4回勉強会)Yuki Naotori
 

More from Yuki Naotori (20)

Sencha touch とyubizo engineで作るネイティブアプリ
Sencha touch とyubizo engineで作るネイティブアプリSencha touch とyubizo engineで作るネイティブアプリ
Sencha touch とyubizo engineで作るネイティブアプリ
 
Ext JS→Sencha
Ext JS→SenchaExt JS→Sencha
Ext JS→Sencha
 
Ext Designerについて
Ext DesignerについてExt Designerについて
Ext Designerについて
 
Ext Direct 入門 II
Ext Direct 入門 IIExt Direct 入門 II
Ext Direct 入門 II
 
Ext JS & HTML5
Ext JS & HTML5Ext JS & HTML5
Ext JS & HTML5
 
Ext.util.Observableについて
Ext.util.ObservableについてExt.util.Observableについて
Ext.util.Observableについて
 
Ext Jsで柔軟に開発仕事をこなす
Ext Jsで柔軟に開発仕事をこなすExt Jsで柔軟に開発仕事をこなす
Ext Jsで柔軟に開発仕事をこなす
 
ExtJS 事例  2ちゃんビューアー「Cromartie49」
ExtJS 事例  2ちゃんビューアー「Cromartie49」ExtJS 事例  2ちゃんビューアー「Cromartie49」
ExtJS 事例  2ちゃんビューアー「Cromartie49」
 
090422 第10回勉強会(公開用)
090422 第10回勉強会(公開用)090422 第10回勉強会(公開用)
090422 第10回勉強会(公開用)
 
Ext.ux.google
Ext.ux.googleExt.ux.google
Ext.ux.google
 
Prototyping tool "Degino"
Prototyping tool "Degino"Prototyping tool "Degino"
Prototyping tool "Degino"
 
第9回勉強会 開発の基本
第9回勉強会 開発の基本第9回勉強会 開発の基本
第9回勉強会 開発の基本
 
第9回勉強会(Ext3.0について)
第9回勉強会(Ext3.0について)第9回勉強会(Ext3.0について)
第9回勉強会(Ext3.0について)
 
第8回Ext勉強会プレゼン - 石丸
第8回Ext勉強会プレゼン - 石丸第8回Ext勉強会プレゼン - 石丸
第8回Ext勉強会プレゼン - 石丸
 
第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料
第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料
第8回 Ext JS / Ext GWT 勉強会 - 小堤氏資料
 
Google Web Toolkit(GWT)入門
Google Web Toolkit(GWT)入門Google Web Toolkit(GWT)入門
Google Web Toolkit(GWT)入門
 
外部ライブラリのExt.Component化
外部ライブラリのExt.Component化外部ライブラリのExt.Component化
外部ライブラリのExt.Component化
 
株式会社テンダ Ext Js
株式会社テンダ Ext Js株式会社テンダ Ext Js
株式会社テンダ Ext Js
 
Ext Ncs 20081029
Ext Ncs 20081029Ext Ncs 20081029
Ext Ncs 20081029
 
080924 Ext Js入門者の最初の壁(第4回勉強会)
080924 Ext Js入門者の最初の壁(第4回勉強会)080924 Ext Js入門者の最初の壁(第4回勉強会)
080924 Ext Js入門者の最初の壁(第4回勉強会)
 

Ext.Directについて

  • 2. 自己紹介 小堤 一弘(こつつみ かずひろ) 株式会社ゼノフィhttp://www.xenophy.com/ Ext Japanhttp://extjs.co.jp/ code:xhttp://code.xenophy.com/ xFrameworkPXhttp://www.xframeworkpx.com/
  • 3. 本日のアジェンダ Ext.Directって何? Ext.Direct Packの準備 基本的なRPCの使い方 Ext.tree.TreePanelとの連携 Ext.grid.GridPanelとの連携 Ext.form.FormPanelとの連携 http://extdirect.xenophy.net/directsample.zip
  • 4. Ext.Directって何? RPC(Remote Procedure Call、リモートプロシージャコール)が行える便利な機能 サーバー通信は、Ext.Ajaxを利用するか、Ext.data.Store経由での通信のみで、サーバー処理との連動は以外とコストがかかる。 Ext.Directを使うとサーバーサイドの関数をJavaScriptの関数のように呼び出すことができて、可読性もよい。 Ext.Directを使うためには、Ext.Direct Packを使うかサーバーサイドを自分で実装する必要がある。
  • 5. Ext.Direct Packの準備 http://www.extjs.com/products/extjs/download.phpから【Ext.Direct Pack】をダウンロードする。 利用したい言語のインタフェースを設置する。 いつもどおり、とりあえずExt JSを使用するためのHTMLとExt.onReadyを記述したJSコードを準備する。 APIを定義する これでだけで準備は完了!
  • 6. Ext.Direct Packの準備 - HTML <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <!-- head --> <head> <!-- content-type --> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta http-equiv="content-script-Type" content="text/javascript" /> <meta http-equiv="content-style-type" content="text/css" /> <!-- /content-type --> <!-- Title --> <title>Ext.Direct</title> <!-- /Title --> <!-- Ext JS --> <link rel="stylesheet" type="text/css" href="./extjs/resources/css/ext-all.css" /> <!-- /Ext JS --> </head> <!-- /head --> <!-- body --> <body> <!-- Ext JS --> <script type="text/javascript" src="./extjs/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="./extjs/ext-all.js"></script> <script type="text/javascript" src="./extjs/src/locale/ext-lang-ja.js"></script> <!-- /Ext JS --> <!-- Application --> <script type="text/javascript" src="./sample1.js"></script> <!-- /Application --> </body> <!-- /body --> </html>
  • 7. Ext.Direct Packの準備 – JSコード Ext.onReady(function(){ alert('Ext.Direct入門'); });
  • 8. 基本的なRPCの使い方 APIを設定する 上記のapi.phpで何が行われているか? Ext.Directプロバイダ追加 classes/Echo.phpのsendをJSから呼び出す。 <!-- Ext Direct API --> <script type="text/javascript" src="api.php"></script> <!-- /Ext Direct API --> Ext.ns('Ext.ss'); Ext.ss.APIDesc = {"url":"router.php","type":"remoting","actions":{"Echo":[{"name":"send","len":1}],"Exception":[{"name":"makeError","len":0}],"Time":[{"name":"get","len":0}],"File":[{"name":"list","len":1,"serverMethod":"listFiles"},{"name":"add","len":2,"formHandler":true}]},"namespace":"Ext.ss"}; Ext.Direct.addProvider(Ext.ss.APIDesc); // sendメソッドコール Ext.ss.Echo.send('Ext.Direct Sample2!');
  • 9. 基本的なRPCの使い方 コールバックを利用する サーバーサイド側のメソッド引数をプロバイダ追加時に定義しているため、同様の引数で呼び出すことができる。 サーバーサイド側のメソッド引数以降は、コールバック関数を設定することができ、その次にスコープを設定できる。 コールバックの引数は、サーバーサイドが返した値になる、PHPの場合配列で返却すると、JS側でも配列になる。 // sendメソッドコール Ext.ss.Echo.send('Ext.Direct Sample3!', function(ret) { alert(ret); }, this);
  • 10. Ext.tree.TreePanelとの連携 ツリーローダーをExt.Directで通信させる。 サーバーサイド側で引数(node-id)に応じてツリー配列を返却すればOK! api.phpにTreeクラスを追加する loader: new Ext.tree.TreeLoader({ directFn: TreePanel.getTree }), $api->add( array( 'Tree' => array('prefix' => 'Class_'), 'Echo' => array('prefix' => 'Class_'), 'Exception' => array('prefix' => 'Class_'), 'Time', 'File' ) );
  • 11. Ext.tree.TreePanelとの連携 Treeクラスを作る。 <?php class Class_Tree { /** * @remotable */ public function get($id){ $ret = array(); if ($id==='root') { $ret[] = array( 'id' => 'node1', 'text' => 'ノード1' ); $ret[] = array( 'id' => 'node2', 'text' => 'ノード2' ); } else { $ret[] = array( 'id' => 'leaf1', 'text' => 'リーフ1', 'leaf' => true ); $ret[] = array( 'id' => 'leaf2', 'text' => 'リーフ2', 'leaf' => true ); } return $ret; } } ?>
  • 12. Ext.tree.TreePanelとの連携 Ext.tree.TreePanelを生成する。 var tree = new Ext.tree.TreePanel({ autoScroll: true, root: { id: 'root', text: 'Root' }, width: 300, height: 500, loader: new Ext.tree.TreeLoader({ directFn: Ext.ss.Tree.get }), renderTo: Ext.getBody() });
  • 13. Ext.grid.GridPanelとの連携 Ext.data.DirectStoreを使ったグリッドを作成する。 api.phpに追加する var grid = new Ext.grid.GridPanel({ title: 'Ext.Direct for Ext.grid.GridPanel', store: new Ext.data.DirectStore({ autoLoad: true, paramsAsHash: false, directFn: Ext.ss.Grid.getAll, root: 'users', fields: [ { name: 'id', mapping: 'id' }, { name: 'name', mapping: 'name' }, { name: 'email', mapping: 'email' } ] }), columns : [ { header: '名前', width: 160, sortable: true, dataIndex: 'name' }, { header: 'メールアドレス', width: 300, sortable: true, dataIndex: 'email' }, ], autoScroll: true, height: 300, renderTo: Ext.getBody() }); 'Grid' => array('prefix' => 'Class_'),
  • 14. Ext.grid.GridPanelとの連携 Grid.phpを作成する。 <?php class Class_Grid { /** * @remotable */ public function getAll(){ $ret = array(); $users = array(); $users[] = array( 'id' => '1', 'name' => '小堤 一弘', 'email' => 'kotsutsumi@xenophy.com' ); $users[] = array( 'id' => '2', 'name' => '斎藤 貴樹', 'email' => 'saito@xenophy.com' ); $users[] = array( 'id' => '3', 'name' => '安永 一博', 'email' => 'yasunaga@xenophy.com' ); $ret['total'] = count($users); $ret['users'] = $users; return $ret; } } ?>
  • 15. Ext.form.FormPanelとの連携 apiを指定して、Ext.Directを利用する。 varbasicInfo = new Ext.form.FormPanel({ title: 'ユーザー情報', padding: 10, buttons:[{ text: 'Submit', handler: function(){ basicInfo.getForm().submit({ params: { foo: 'bar', uid: 34 } }); } }], defaults: {anchor: '-20'}, defaultType: 'textfield', items: [{ fieldLabel: 'Name', name: 'name' },{ fieldLabel: 'Email', msgTarget: 'side', name: 'email' },{ fieldLabel: 'Company', name: 'company' }], api: { load: Ext.ss.Form.getBasicInfo, submit: Ext.ss.Form2.updateBasicInfo }, paramOrder: ['uid', 'foo'], width: 500, height: 180, renderTo: Ext.getBody() }); basicInfo.getForm().load({ params: { foo: 'bar', uid: 34 } });
  • 16. Ext.form.FormPanelとの連携 サーバーサイドのクラスを準備する。 <?php class Class_Form { /** * @remotable */ function getBasicInfo($userId, $foo){ return array( 'success'=>true, 'data'=>array( 'name'=>'Kazuhiro Kotsutsumi', 'company'=>'Xenophy', 'email'=>'kotsutsumi@xenophy.com' ) ); } } ?> <?php class Class_Form2 { /** * @remotable */ function updateBasicInfo($formPacket){ $response = array(); $response['errors'] = array( 'email'=>'kotsutsumi@xenophy.comを入力してください。' ); $response['success'] = false; return $response; } } ?>
  • 17. まとめ サーバーサイドのやりとりが非常に便利になる。 感覚的にサーバーサイドへJSコードでアクセスできる。 だけど・・・ サンプルに入っているExt.Directの書き方が若干違ったり(api.phpとか)するし、APIの生成(JSON)がおかしかったりする・・・。 Symphonyなどのフレームワーク用のExt.Direct用のクラスも配布されている。 なんだかんだ、ちゃんと作る前にサーバーサイドのインタフェースの作りはちゃんと理解しておく必要がある。
  • 18. 手前味噌ですが・・ xFrameworkPXにはxFrameworkPX_Controller_ExtDirectクラスが存在する。 モジュールを作成して、コントローラーに登録するだけでモジュール名でJS側からアクセスできる。 サーバーサイドのやりとり(api.phpとかrouter.phpの部分)は、ちゃんとオリジナルで実装して動作確認済。 MVCのModel部分をExt側から透過的に利用できるため、開発が高速。 なんていう宣伝。
  • 19. 時間があまったら JSコードの隠蔽化 Googleクロージャーツール http://closure-compiler.appspot.com/home Amateta SWF ENCRYPT http://www.amayeta.com/software/swfencrypt/ Motion Decompiler SWFのタイムラインにJSコードを埋め込んで、実行する。SWFが暗号化されているため、デコンパイルしてもJSコードを抽出できない