Flash Builder 4 -> PHPからのデータの受け取り方
PHPサービスを利用した場合のデータの受け取り方。
本には接続方法とテストの仕方しか載ってない。
しかも似たようなコードをズラズラ並べて。。。
そのスペースで受け取り方を書いてくれればよかったのになぁ。
グーグル先生に聞いても、DataGridへのバインドの仕方は載ってても
個々に受け取って処理する方法がない。
大体戻り値は配列しかないのかしら?
「戻り値の設定」では、Booleanでも自動検出できたのに。
デザインモードからボタンのクリックイベントで getUserInfo メソッドを設定したら
[mxml]
{
getUserInfoResult.token = dbCooperate.getUserInfo(/*次の値を入力 : */ username, password);
}[/as3onfx4]
こんなんが自動生成された。
ので、引数にテキストボックスのテキストを設定。
[as3onfx4]protected function btnLogin_clickHandler(event:MouseEvent):void
{
getUserInfoResult.token = dbCooperate.getUserInfo(txtUserName.text, txtPassword.text);
}[/as3onfx4]
深く考えずに getUserInfoResult.token にユーザ情報が入ってるんだろうと
trace してみたけど、Object とか出るだけでてんでダメ。
そこで token ってなんじゃろ と思い
PHP&MySQLとの連携 で作成した
を見ると
[as3onfx4]public function getUserInfo(username:String, password:String) : mx.rpc.AsyncToken
{
var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation(“getUserInfo”);
var _internal_token:mx.rpc.AsyncToken = _internal_operation.send(username,password) ;
return _internal_token;
}[/as3onfx4]
こんな感じ。
ほぉほぉ、mx.rpc.AsyncToken とかいうクラスなのね。
で、それ何?
このクラスは、非同期 RPC 処理のための追加データまたはトークンレベルのデータを設定する場所を提供します。また、個々の呼び出しに IResponder を追加することもできます。AsyncToken は、ResultEvent および FaultEvent(token プロパティ)で参照することができます。
Adobe® Flex™ 3.2 リファレンスガイド:AsyncToken
ふーん。
そういうわけらしいので、具体的な手法をグーグル先生に聞いてみると
どうも2種類やり方があるような・・・。
Adobeのチュートリアル動画:Flex Test Drive:データベースの変更
に出てきたやり方が
saturnboy:LCDS and MySQL Views
をはじめとするいくつかのサイトに載っていたので試してみたけど
エラーばっかりでダメ。
諦め。。。た。
aki193の日記:Flexの実装(AsyncTokenとAsyncResponder、Javaのリモート呼び出し)
を参考に以下のようにしてみたら受け取りに成功した。 🙂
[as3onfx4]import mx.rpc.AsyncResponder
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
protected function btnLogin_clickHandler(event:MouseEvent):void
{
getUserInfoResult.token = dbCooperate.getUserInfo(txtUserName.text, txtPassword.text);
getUserInfoResult.token.addResponder(new AsyncResponder(successUserInfo,failUserInfo));
}
//リモートアクセス成功時
private function successUserInfo(event:ResultEvent, obj:Object=null):void{
// ObjUserInfo は、「戻り値の設定」で設定した独自オブジェクト
var myUserInfo:ObjUserInfo = event.result as ObjUserInfo;
trace(myUserInfo.id);
mx.controls.Alert.show(myUserInfo.id);
}
//リモートアクセス失敗時
private function failUserInfo(event:FaultEvent, obj:Object=null):void{
trace(“FaultCode:” + event.fault.faultCode + “\n” + “FaultString:” + event.fault.faultString + “\n”
+ “FaultDetail:” + event.fault.faultDetail);
trace(“fault”);
}[/as3onfx4]
ただし、13~14行目のところ。
id を name に変えてみたところ
データが更新されない。
ブラウザのキャッシュかな と思って
キャッシュをクリアしたら無事に更新された。
ん~、デバッグの度にキャッシュをクリアせんといかんのかなぁ。
オブジェクト型なので、多次元配列という言葉を用いてよいかわからないけど
複数レコードを格納している場合は、以下のように。
[as3onfx4]//リモートアクセス成功時
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]
また、もしプロパティ名(要素名、キー)を取得したい場合は 配列の書き方 を参照。
現時点までの範囲で、さっきまで思惑通りに動いていたのに
急にこんなアラートが。
へ?
ちょっとビビリながら、あれこれ見ていると
FB4 のコンソールビューに
FaultCode:Client.Error.DeliveryInDoubt
FaultString:チャンネルが切断されました
FaultDetail:応答を受信する前に、チャンネルが切断されました。
fault
あ、これ FaultEvent だ!
つまりリモートアクセスに失敗したってことか・・・。
あああ、そうか。DBの実験してて、接続情報を PDO 用に変更したんだった。
DB接続情報を mysqli 用に戻したら無事に動いた。
よい経験になった。 🙂
しっかし、データを受け取るだけで相当はまってしまった。
まだ全面的には解決してないしね。
初心者だからって、これはまずいなぁ。