カテゴリー

最新の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブログ検索

RSSフィード

ブロとも申請フォーム

この人とブロともになる

スポンサーサイト

スポンサー広告
--.--.--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ベンチャーブログのランキングに参加しています。
下のバナーをクリックして応援していただけると嬉しいです。
にほんブログ村 ベンチャーブログへ

PHPフレームワークもどき「PnF」(5)~サンプルコード「MenuBox」

PHP
2008.11.24
それではサンプルアプリケーションのコードを作成してみます。まずは「MenuBox」のコードからです。ビューコンポーネントのコードの実態は「ひとつのクラス定義」なのですが、ここではいくつかの部分に分けて説明したいと思います。
なおここからは、ビューコンポーネントをVC、ビューパーツをVPと記述します。

まずは前半部分から。

コード5-1

3行目
親クラスの定義をインクルードしています。ビューコンポーネントに必要な処理のほとんどは親クラスに実装されています。「VIEWCOMPONENT_DIR」はこの親クラスが格納されているディレクトリパスを示しており、config.phpの中で定義されています。

5行目
親クラス「ViewComponent」から「VcMenuBox」を派生させています。クラス名はなんでもいいのですが、頭に「Vc」を付けることをルールにしています。また他のVCクラス名と名前がバッティングしないことも必要です。

14~15行目
このVCに固有のプロパティの定義です。VCが保持する必要がある情報を格納します。MenuBoxにはそのような情報は特にないので、ここは空配列を記述します。

17~38行目
このVCが使用するVPを宣言しています。宣言の記述方法は、各VP名をキーとする連想配列の形で行います。各連想配列の値は、VPのプロパティを格納した構造体です。
ここでは操作メニューのリストを「Menu」という名前のVPとして宣言しています。VPの内容は「VpMenuList」というクラスで定義されています。「VpMenuList」というクラスは、<a>タグで記述されたリンクにJavaScriptでサブミット機能を与えたものを、複数定義できるというものです。各項目の意味は以下の通りです。

 'class_name' :VPを定義しているクラス名です。
 'data_type'  :このVPがどのようなPOST変数を受け取るのか。
         この定義によってフィルタリングを行います。
 'menu_list'  :各メニューのデータです。
         以下の組み合わせを複数設定できます。

  'value'   :メニューがクリックされた時のPOST変数の値。
  'text'    :メニューに表示される文字列。
  'href'    :JavaScriptが無効である場合のリンク先。

ここでは「アイテムを追加」「リストをクリア」という、ふたつのメニュー項目を定義しています。なお'value'で定義した文字列は、メニューがクリックされた時に、このVCに対して「ローカルイベント」として引き渡されます。ローカルイベントとは、自分自身だけにパブリッシュされるイベントのことです。他にグローバル、アウトサイドという2種類のパブリッシュ方法がありますが、VPが直接発生させるイベントは、すべてそのVPを使用しているVCのローカルイベントになります。
ちなみに「VpMenuList」の内容は以下の通りです。

コード5-2-1
コード5-2-2


ちょっとコメントが長いのですが、実際のコードはそれほど長くないのがおわかりいただけると思います。VPのコードの詳細については別の機会に説明します。

40~41行目
このVCで処理を引き受けるGET変数を定義します。ここでは何も引き受けないので空配列を記述します。

43~58行目
イベントとアクションメソッドの対応を定義しています。ここに記述されたイベントだけが、このVCによってサブスクライブされます。ここでは、先ほどのVPで定義された「OPEN_ENTRY_FORM」と「CLEAR_LIST」が定義され、アクションメソッドと結びつけられています。また「REFRESH」というのはすべてのVCで発生したすべてのイベント処理が終わった後に、PnFコアが自動的に発生させるイベントです。これを捕捉することで画面表示直前に行いたい処理を実行できます。画面表示要素を最終的にリフレッシュする場合に使われるだろうという想定で「REFRESH」という名前にしてあります。

次に後半部分です。

コード5-3

65~66行目
イベント処理チェーンに入る直前に実行したい処理を「前処理」として記述します。このVCでは何も行いません。

68~71行目
イベント/アクションメソッドの対応で定義された「openAddForm」の処理内容です。openAddFormは「FormBox」を表示させるためのメソッドですが、外部のVCに直接アクセスすることは許されません。VC間のやり取りの基本は、イベントを発生させ、それを捕捉してもらう、という手続きになります。
ここではローカルイベントとして捕捉した「OPEN_ENTRY_FORM」を「setEvent」というメソッド(PnFコアで定義されています)で、再びパブリッシュしています。自分自身にこのイベントがやってくると無限ループになるため、イベントタイプは「OUTSIDE」にしています。これは自分以外のVCにイベントをパブリッシュする、という設定です。またイベントパブリッシュの時にはデータを引き渡すこともできます。ここでは引き渡すべきデータがないので「''」としています。
なお第1引数にある「$this->getVcName()」というのは、自分自身の名前(VC名、ここでは「MenuBox」)を取得するためのメソッドです。これはデバッグ用に用意された引数です。(デバッグ機能については別の機会に説明します)

73~76行目
同じく「clearList」の処理内容です。目的は「ItemListBox」の内容のクリアですが、ここでもイベントを外部に再伝達する形になっています。

78~79行目
REFRESHイベントに対応した処理の記述です。ここでは何も行いません。

84~103行目
このVCが最終的に表示する、HTMLのテンプレートです。パブリックなメソッドとして定義されており、VCが表示するHTMLの内容が文字列として返されます。基本的にはPnFコアから呼び出されますが、VCが他のVCを配下に持った場合には、上位のVCのHTMLテンプレートから呼び出されることになります。
VCが使用しているVPにも、HTMLテンプレート関数があります。VCがVPを表示要素にする場合には、VPのHTMLテンプレートを呼び出すことになります。これを可能にするのが「getVpViewData」メソッドです。これはVCの親クラスで定義されているので、頭に「$this->」を付けて呼び出します。引数はVP名とイテレータです。イテレータは複数要素を持つVPから、特定要素に関するタグのみを取り出すために用意したのですが、現在のPnFでは使用されていません。ここでもNULLを渡しています。

このようにVCの作成は、いくつかの定義(宣言)と、アクションメソッドの記述、HTMLテンプレートの記述で構成されます。つまり「最初にMVCを分けてしまう」のではなく、「まずビューコンポーネント毎にブロックを分けて、その中でControlとViewを分け、必要に応じてControlからModelを呼び出す」というイメージです。イベント名の整合性は必要ですが、それ以外は他のVCの存在を意識する必要はありません。これによって開発時に「視野に入れるべきエリア」を最小化できるわけです。
スポンサーサイト

ベンチャーブログのランキングに参加しています。
下のバナーをクリックして応援していただけると嬉しいです。
にほんブログ村 ベンチャーブログへ

FC2Ad

相続 会社設立

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。