Flash Builder 4 -> PHPからのデータの受け取り方

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-07 (水) 18:38:16 | 最終更新:2010-07-25 (日) 2:19:45

PHPサービスを利用した場合のデータの受け取り方。

本には接続方法とテストの仕方しか載ってない。
しかも似たようなコードをズラズラ並べて。。。
そのスペースで受け取り方を書いてくれればよかったのになぁ。

グーグル先生に聞いても、DataGridへのバインドの仕方は載ってても
個々に受け取って処理する方法がない。

大体戻り値は配列しかないのかしら?
「戻り値の設定」では、Booleanでも自動検出できたのに。

デザインモードからボタンのクリックイベントで getUserInfo メソッドを設定したら
[mxml]

[/mxml]

  1. protected function btnLogin_clickHandler(event:MouseEvent):void
  2. {
  3.     getUserInfoResult.token = dbCooperate.getUserInfo(/*次の値を入力 : */ username, password);
  4. }

こんなんが自動生成された。
 
ので、引数にテキストボックスのテキストを設定。

  1. protected function btnLogin_clickHandler(event:MouseEvent):void
  2. {
  3.     getUserInfoResult.token = dbCooperate.getUserInfo(txtUserName.text, txtPassword.text);
  4. }

 
深く考えずに getUserInfoResult.token にユーザ情報が入ってるんだろうと
trace してみたけど、Object とか出るだけでてんでダメ。

そこで token ってなんじゃろ と思い
PHP&MySQLとの連携 で作成した

_Super_DbCooperate.as

を見ると

  1. public function getUserInfo(username:String, password:String) : mx.rpc.AsyncToken
  2. {
  3.     var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("getUserInfo");
  4.     var _internal_token:mx.rpc.AsyncToken = _internal_operation.send(username,password) ;
  5.  
  6.     return _internal_token;
  7. }

こんな感じ。

ほぉほぉ、mx.rpc.AsyncToken とかいうクラスなのね。
で、それ何?

このクラスは、非同期 RPC 処理のための追加データまたはトークンレベルのデータを設定する場所を提供します。また、個々の呼び出しに IResponder を追加することもできます。AsyncToken は、ResultEvent および FaultEvent(token プロパティ)で参照することができます。

Adobe® Flex™ 3.2 リファレンスガイド:AsyncToken

ふーん。

そういうわけらしいので、具体的な手法をグーグル先生に聞いてみると
どうも2種類やり方があるような・・・。
 

<s:CallResponder/>内に記述する方法

Adobeのチュートリアル動画:Flex Test Drive:データベースの変更
に出てきたやり方が
saturnboy:LCDS and MySQL Views
をはじめとするいくつかのサイトに載っていたので試してみたけど
エラーばっかりでダメ。

諦め。。。た。
 

AsyncResponder を用いる方法

aki193の日記:Flexの実装(AsyncTokenとAsyncResponder、Javaのリモート呼び出し)
を参考に以下のようにしてみたら受け取りに成功した。 🙂
 

  1. import mx.rpc.AsyncResponder
  2. import mx.rpc.events.ResultEvent;
  3. import mx.rpc.events.FaultEvent;
  4.  
  5. protected function btnLogin_clickHandler(event:MouseEvent):void
  6. {
  7.     getUserInfoResult.token = dbCooperate.getUserInfo(txtUserName.text, txtPassword.text);
  8.     getUserInfoResult.token.addResponder(new AsyncResponder(successUserInfo,failUserInfo));
  9. }
  10.  
  11. //リモートアクセス成功時
  12. private function successUserInfo(event:ResultEvent, obj:Object=null):void{
  13.     // ObjUserInfo は、「戻り値の設定」で設定した独自オブジェクト
  14.     var myUserInfo:ObjUserInfo = event.result as ObjUserInfo;
  15.  
  16.     trace(myUserInfo.id);
  17.     mx.controls.Alert.show(myUserInfo.id);
  18. }
  19.  
  20. //リモートアクセス失敗時
  21. private function failUserInfo(event:FaultEvent, obj:Object=null):void{
  22.     trace("FaultCode:" + event.fault.faultCode + "\n" + "FaultString:" + event.fault.faultString + "\n"
  23.         + "FaultDetail:" + event.fault.faultDetail);
  24.     trace("fault");
  25. }

ただし、13~14行目のところ。

id を name に変えてみたところ
データが更新されない。

ブラウザのキャッシュかな と思って
キャッシュをクリアしたら無事に更新された。

ん~、デバッグの度にキャッシュをクリアせんといかんのかなぁ。
 

戻り値が多次元配列(?)の場合

オブジェクト型なので、多次元配列という言葉を用いてよいかわからないけど
複数レコードを格納している場合は、以下のように。
//リモートアクセス成功時
private function successUserInfo(event:ResultEvent, obj:Object=null):void{
// ObjUserInfo は、「戻り値の設定」で設定した独自オブジェクト
var myUserInfo:ObjUserInfo;

for (var i:Number = 0; i < event.result.length; i++) { myUserInfo = event.result[i] as ObjUserInfo; } }[/as3onfx4] また、もしプロパティ名(要素名、キー)を取得したい場合は 配列の書き方 を参照。
 

FaultEvent

現時点までの範囲で、さっきまで思惑通りに動いていたのに
急にこんなアラートが。

へ?
ちょっとビビリながら、あれこれ見ていると
FB4 のコンソールビューに

FaultCode:Client.Error.DeliveryInDoubt
FaultString:チャンネルが切断されました
FaultDetail:応答を受信する前に、チャンネルが切断されました。
fault

あ、これ FaultEvent だ!

つまりリモートアクセスに失敗したってことか・・・。
あああ、そうか。DBの実験してて、接続情報を PDO 用に変更したんだった。

DB接続情報を mysqli 用に戻したら無事に動いた。
よい経験になった。 🙂

 
しっかし、データを受け取るだけで相当はまってしまった。
まだ全面的には解決してないしね。

初心者だからって、これはまずいなぁ。

Posted by muchag | ActionScript 3.0,Flash Builder 4 |
初回投稿:2010-07-07 (水) 18:38:16 | 最終更新:2010-07-25 (日) 2:19:45

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment