掲載誌情報
掲載誌 日経Linux 2003/02〜
タイトル リッチインターネットアプリケーションを開発しよう! 第5回
サブタイトル ColdFusion MXとFlash MXで作るリッチインターネットアプリケーションをMVCモデルで学ぶ

3-2-3. Controller
    次に、前項までで作成したView, Modelを制御するためのControllerとして、「Controller」クラスを作成する。
「Controller」クラスでは次の機能を実装する。
 ・ 画面切り替え制御
 ・ Viewのイベントコントロール
 ・ Modelのイベントコントロール

「Controller」クラス / 「Controller.as」ファイル
/*
 CLASS Controller class / Controller
*/

//Constractor
Controller = function() {
 //初期処理
 this.timeStampModel = new TimeStampModel();
};
(1)

//画面切替え
Controller.prototype.windowChange = function(winSymbolName) {
 removeMovieClip(this.currentView);
 this.currentView = attachMovie(winSymbolName, winSymbolName, 1);
 this.currentView._x = 300;
 this.currentView._y = 85;
};
(2)

//View イベントコントロール
Controller.prototype.sendViewMessage = function(message) {
 switch(message){
   //タイムカード出退社画面表示
 case "WIN_TIME_STAMP":
  this.windowChange("timeStampSymbol");
  break;
  //タイムカード 出社打刻
 case "TIMECARD_COMMING":
  var ret = this.currentView.getValue();
  this.timeStampModel.stamp("C", ret.userID, ret.password);
  break;
  //タイムカード 退社打刻
 case "TIMECARD_QUITTING":
  var ret = this.currentView.getValue();
  this.timeStampModel.stamp("Q", ret.userID, ret.password);
  break;
 }
};
(3)

//Model イベントコントロール
Controller.prototype.sendModelMessage = function(message, data) {
 switch(message){
   //タイムカード 打刻終了
  case "STAMP_END":
   this.windowChange("timeMessageSymbol");
   this.currentView.dspMsg(data);
   break;
 }
};
(4)

ここでのポイントは次のとおりだ。ポイントの番号は、プログラムコード中に示した番号を指す。
(1) クラスの定義
まず、TimeStampModeのクラス定義を行っている。
ここでは、初期処理として、3-2-2で作成したModel「TimeStampModel」をインスタンス化している。
(2) 画面切替えメソッド定義
3-1で解説した図3-1のコンテンツエリアに、所定の画面(タイムカード打刻画面、メッセージ表示画面)を表示するためのメソッド「windowChange」を定義する。
このメソッドは、パラメータとしてMovieClipの識別子(あらかじめ「シンボルのプロパティ」画面で設定しておいた、MovieClipに一意につける名前)を受け取り、該当するMovieClipを画面上に動的に配置する。
なお、MovieClipが画面に配置された時点で、MovieClipに関連付けられたクラス(3-2-1(4)参照)がインスタンス化されるので、そのインスタンスを変数「this.currentView」に格納しておく(後述のメソッド(3)、(4)で使用するため)。
なお、MovieClipを画面上に動的に配置するには、Flash MXで標準で用意されている「attachMovie」メソッドを使用する。
(3) View イベントコントロールメソッド定義
3-2-1で作成したView(「TimeStampView」、「TimeMessageView」)の制御を行うためのメソッド「sendViewMessage」を定義する。
このメソッドでは、各Viewからパラメータとして、イベントメッセージ(出社打刻、退社打刻などの処理を認識するため、任意に命名した文字列)を受け取り、イベントメッセージの種類に応じて、必要な制御を行う。このメソッドは、各Viewから必要に応じて呼び出される。
例えば、「TimeStampView」が管理するタイムカード打刻画面で、出社ボタンがクリックされると、当「Controller」クラスの「sendViewMessage」が「TimeStampView」から呼び出され、その際パラメータとして「TIMECARD_COMMING」を受け取る。「sendViewMessage」メソッドでは、「TIMECARD_COMMING」を認識し、出社打刻に必要な下記制御を行う。
a) 入力されたUserID, Password情報の取得
入力されたUserID, Password情報を取得するために、「TimeStampView」クラスの入力値取得メソッド「getValue」を呼び出す。
なお、「this.currentView」変数には現在表示中のViewのインスタンスが格納されているので、「this.currentView.getValue();」と記述することで、「TimeStampView」クラスの「getValue」メソッドを呼び出すことになる。
b) タイムカード打刻処理
タイムカード出社打刻処理を行うために、「TimeStampModel」クラスの出退社打刻メソッド「stamp」を呼び出している。
なお、「this.timeStampModel 」変数には初期処理で、「TimeStampModel」クラスのインスタンスが格納されているので、「this.timeStampModel.stamp("C", ret.userID, ret.password);」と記述することで、「TimeStampModel」クラスの「stamp」メソッドを呼び出すことになる。
(4) Model イベントコントロールメソッド定義
3-2-2で作成したModel(「TimeStampModel」)の制御を行うためのメソッド「sendModelMessage」を定義する。
このメソッドでは、各Modelからパラメータとして、(3)と同様、イベントメッセージを受け取り、イベントメッセージの種類に応じて、必要な制御を行う。このメソッドは、Modelから必要に応じて呼び出される。
例えば、「TimeStampModel」でColdFusionコンポーネントの通信結果を受信すると、当「Controller」クラスの「sendModelMessage」が「TimeStampModel」から呼び出され、その際パラメータとして「STAMP_END」を受け取る。「sendModelMessage」メソッドでは、「STAMP_END」を認識し、打刻終了時に必要な下記制御を行う。
a) メッセージ表示画面の表示
「windowChange」メソッドを呼び出すことで、メッセージ表示画面を表示している。
b) ) メッセージの表示
「TimeMessageView」クラスの「dspMsg」メソッドを呼び出すことで、メッセージ表示画面のメッセージ表示エリアへ指定した文字列を表示している。
  3-2-4. 初期処理
    最後に、今まで作成してきたクラスを、3-2-1で解説したFlash MX ファイル上で動作させるためのプログラムコードを記述する。
まず、次の図のように、タイムラインの1フレーム目に、プログラムコードを記述する。
(図3-5)

1フレーム目のプログラムコード
//Flash Remoting
#include "NetServices.as"
#include "NetDebug.as"
(1)

//Controller
#include "Classes/Controller/Controller.as"

//View
#include "Classes/View/TimeStampView.as"
#include "Classes/View/TimeMessageView.as"

//Model
#include "Classes/Model/TimeStampModel.as";
(2)

ここでのポイントは次のとおりだ。ポイントの番号は、プログラムコード中に示した番号を指す。
(1) FlashRemotingのライブラリのインクルード
サーバとの連携に必要となる、Flash MXに標準のActionScript ライブラリをインクルードする。
(2) 各クラスのインクルード
外部テキストファイルとして作成した、View, Model, Controllerの各クラスをインクルードする。
インクルードすることで、各クラスが使用可能となる。
外部ファイルとして、作成したクラスを使用するには、まず、このようにMovieClipを配置する前のフレームにて必要なファイルを全てインクルードしておく。

次に、先程と同様に、タイムラインの2フレーム目に、プログラムコードを記述する。
2フレーム目のプログラムコード
//アプリケーション初期処理
_global.Controller = new Controller(); (1)
_global.Controller.sendViewMessage("WIN_TIME_STAMP"); (2)
stop();

ここでのポイントは次のとおりだ。ポイントの番号は、プログラムコード中に示した番号を指す。
(1) Controllerクラスのインスタンス化
3-2-3で作成した「Controller」クラスをインスタンス化し、インスタンスを変数「_global.Controller」に格納している。変数名の前に「_global」をつけて宣言することで、Flash MX内のどこからでも参照可能な変数となる。
(2) タイムカード打刻画面表示
イベントメッセージ「WIN_TIME_STAMP」をパラメータに指定して、「Controller」クラスの「sendViewMessage」メソッドを呼び出すことで、タイムカード打刻画面を表示している。

後は、タイムカード打刻画面をユーザーが操作することで、必要に応じてView, Model, Controllerが動作し、タイムカード打刻機能が機能する。
以上で、タイムカード打刻機能の実装は完了だ。その他の機能についても、今まで解説してきた手法を応用することで容易に実装可能となる。
今回解説した、タイムカード打刻機能のサンプルを付録CD-ROMに収めているので、そちらも参照していただきたい。

BACK  
PAGETOP
CLOSE