Flashコンテンツに無くてはならないXMLのロード部分を作ってみようと思います。
イメージとしては、フレームワーク内のどこからでもリクエストが可能で、読み込んだXMLデータはModel内のクラスに作った配列に格納します。そして、格納済みのXMLもどこからでも呼び出して何度でも使えるようにしたいと思います。
まず、XMLロード側から書いてみます。XMLロードは恐らくController経由で行うことになると思うので、AllControllerを経由して、RequestXML.asというクラスにロードするXMLのURLとキー(後述)、文字コードを判定するBooleanを渡しています。さらにそこからLoadXML.asというクラスに渡して、実際のロード処理を行っています(このクラスは大重美幸さん著「Flash ActionScript3.0入門ノート」にあったものを元に、必要な部分を書き直しています)。
LoadXML.as:
package framework.controller{
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.system.System;
import flash.events.Event;
public class LoadXML{
//////////////////////////////////////////////////////////////////////////////////////
private var o_xmlLoader:URLLoader;
private var o_xml:XML;
private var v_key:String;
//////////////////////////////////////////////////////////////////////////////////////
//Constructor
public function LoadXML(thisUrl:String, thisKey:String, thisCode:Boolean){
trace("LoadXML");
//URLLoader作成
o_xmlLoader = new URLLoader();
o_xmlLoader.dataFormat = URLLoaderDataFormat.TEXT;
o_xmlLoader.addEventListener(Event.COMPLETE, onXMLloaded);
v_key = thisKey;
//URL
var myUrlReq:URLRequest = new URLRequest(thisUrl);
//Unicode以外ならばtrue
System.useCodePage = ! thisCode;
//読み込み開始
o_xmlLoader.load(myUrlReq);
}
//////////////////////////////////////////////////////////////////////////////////////
//読み込み完了
private function onXMLloaded(event:Event):void{
trace("onXMLloaded");
try{
//XMLオブジェクトに変換
o_xml = new XML(o_xmlLoader.data);
//XMLをModelに保存する
Framework.c_allModel.f_saveXML(o_xml, v_key);
o_xmlLoader = null;
o_xml = null;
}catch(err:TypeError){
trace(err.message);
}
}
//////////////////////////////////////////////////////////////////////////////////////
}
}
ここで追加・変更している点は、ロードしたXMLをModel内に格納するときに使用するユニークキーの存在と、ロード完了した後にイベントで通知を返すのではなくModelにXMLデータとキーを渡すようにしています。Modelに渡されたXMLデータはAllModelを経由してDataXML.asというクラス内のメンバである連想配列に以下のような感じで格納されます。
DataXML.as内のXML格納部分:
//データを保存し、 Controller に連絡する
public function f_saveXML(thisXML:XML, thisKey:String):void{
trace("DataXML f_saveXML");
xmlArray[thisKey] = thisXML;
Framework.c_allController.f_onLoadXML(thisKey);
}
XMLのロードが完了し、Modelに格納できたらその直後にController経由で再度RequestXML.asにキーを渡しています。このキーによって、次の処理を振り分けるようにswitch文を書いています。前後しましたが以下がそのRequestXML.asです。
RequestXML.as:
package framework.controller{
import flash.events.Event;
import flash.display.DisplayObjectContainer;
import framework.controller.LoadXML;
public class RequestXML{
//////////////////////////////////////////////////////////////////////////////////////
private var c_loadXml:LoadXML;
private var thisXML:XML;
//////////////////////////////////////////////////////////////////////////////////////
//Construnctor
public function RequestXML(){
trace("RequestXML");
}
//////////////////////////////////////////////////////////////////////////////////////
//XMLをリクエストして取得
public function f_requestXML(thisUrl:String, thisKey:String, thisCode:Boolean):void{
c_loadXml = new LoadXML(thisUrl, thisKey, thisCode);
}
//XML取得完了後の処理を分岐
public function f_onLoadXML(thisKey:String):void{
var myXML:XML;
switch(thisKey){
case "aaa":
//処理
break;
case "bbb":
//処理
break;
default:
//処理
break;
}
trace(myXML);
}
//////////////////////////////////////////////////////////////////////////////////////
}
}
RequestXML.asとLoadXML.asは分ける必要はないかもしれませんが、見通しがよくなるように別にしました。
最後に、XMLをロードするコードと、ロードしたXMLを取得するコードです。
Framework経由でアクセスするので、以下の書き方でどこからでも呼べるはずです。
//XMLを読み込み
Framework.c_allController.f_requestXML([ URL ], [ Key ], [ Boolean ]);
//読み込んだXMLを取得
Framework.c_allController.f_onLoadXML([ Key ]);
とりあえず、これでXMLデータが扱えるようになりました。
リクエスト時のURLは静的XMLのものである必要はなく返されるデータ型がXMLであればいいので、PHPやCGIなどに引数付きのURLを渡してDBからデータをセレクト・生成したXMLを返すようにすれば、もっと便利に使えるようになります(まぁ当たり前の事ですけど)。