カテゴリー

最新の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブログ検索

RSSフィード

ブロとも申請フォーム

この人とブロともになる

スポンサーサイト

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

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

PHPフレームワークもどき「PnF」(10)~ソースコード

PHP
2008.11.26
PnFのコアと「PHPフレームワークもどき「PnF」(3)~サンプルアプリを作ってみよう」に掲載したサンプルアプリのソースコードを公開します。以下のリンクをクリックすると、アーカイブファイルをダウンロードできます。

ダウンロード pnf_sample.tar.gz (32.1K)

このファイルを適当なところにダウンロードし、アーカイブを展開してください。Linux上で作成したtarボールなので、以下のLinuxコマンドで解凍できます。pnf_sampleというディレクトリが作成され、その下にファイルが展開されます。

tar xvzf pnf_sample.tar.gz

Windows上にダウンロードし、右クリック→即時解凍でも解凍できると思います(Windows XP Proで確認)。ただし日本語のエンコーディングがUTF-8なので、ファイルを読むときにはUTF-8をサポートするエディタを使用してください。コード本体には日本語文字列を使っていないはずですが、コメントはすべて日本語で記述されています。

PHPが動く環境で、Apacheのドキュメントルートの下にファイルを展開した場合には、サンプルアプリを実行できます。例えばドキュメントルート直下でアーカイブを展開した場合には、以下のURLでサンプルアプリにアクセスできるはずです。

http://<HTTPサーバーのサーバー名かIPアドレス>/pnf_sample/sample.php

なお申し訳ありませんが、現時点ではまともなドキュメントはありません。可読性を意識してソースを書いたつもりなので、もしよろしければソースコードを追いかけてみてください。sample.phpから呼び出されているMainProcedure.class.phpから順番にソースを追いかけていけば、何をしているのかがわかると思います。なおDataModelディレクトリにあるクラスファイルは、データベーステーブルの構成に依存する内容になっているので、とりあえずは無視してください。

大まかな内部処理は、以下のチャートのようになっています。
(クリックすると拡大表示されます)

処理の流れ

著作権は放棄しませんが、このソースコードをどのように使っていただいても構いません。ただし何らかのレスポンスをいただけることを期待しています。

よろしくお願いします。
スポンサーサイト

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

PHPフレームワークもどき「PnF」(9)~サンプルコード、画面全体の構成

PHP
2008.11.24
最後に画面全体の構成をコードに落としていきましょう。まず前半部分です。

コード9-1

5~6行目
アプリケーション全体の設定ファイルと、PnFのメインプロシジャのファイルをインクルードしています。

9~11行目
この画面の名前(コントロール名)を設定しています。この設定はPnFの内部処理に使用するものです。

14~28行目
この画面で使用するVCを宣言しています。「ItemBox」が宣言されていないことに注意してください。別のVCの子VCとして生成されるVCは、ここで宣言する必要はありません。

31行目
PnFのメインプロシジャを呼び出しています。

なお前半部分でページ毎に記述が変わるのは、14~28行目の「使用するVCの宣言」の部分だけです。他のコード記述は固定です。

次に後半部分です。

コード9-2

HTMLテンプレートの記述です。画面全体のHTMLテンプレートも、PHPの関数として記述します。47~56行目はヘッダ部分、58~72行目がボディ部分です。ボディ部分に${vc[VC名]}という記述が埋め込まれています。$vcはこのHTMLテンプレートがPnFコアから呼び出される時に引き渡される引数であり、ここに使用するすべてのVCのHTML記述が連想配列として格納されているのです。

なお「config.php」の内容と、CSSファイルの内容は以下の通りです。

config.php
コード9-3

CSSファイル(style.css)
コード9-4

以上でサンプルアプリケーションのコード解説を終わります。簡単なものでしたが、PnFを使ったコーディングの概要がご理解いただけたのではないかと思います。

コード量は決して大幅に減るわけではないのですが、画面全体、各VC、各VPの独立性が極めて高く、簡単に分離・結合できる点が最大のメリットです。そのため複雑な画面構成を持つアプリケーションでも、適当な要素に分割して開発生産性を高めることができ、特定要素の修正が他の部分に与える影響も最小化できます。もちろんいったん作成したVCやVPは、簡単に再利用できます。イベント名と引き渡されるイベントパラメーターの整合性さえ取れていれば、画面全体構成のコードに追加するだけでいいからです。

ただし最初に指摘したとおり、まだ十分に練れていない部分もかなりあります。例えばGET変数をVCで処理するのが適切なのか、まだ十分に検討されていません。他にも検討の余地が残っている部分があります。

ここまでの内容に対してそれなりの反応があれば、さらに詳細な説明を行い、PnF内部のコードの公開も検討したいと思っています。もし芳しい反応がなければ、公開作業は中断します。質問や意見などがございましたら、各エントリーのコメントの形で投げてください。それではよろしくお願いします。

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

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

PHP
2008.11.24
VCのコードとしてはこれが最後です。「ItemBox」のコードです。

コード8-1

3~5行目
まずVCの親クラスをインクルードし「VcItemBox」クラスを派生させます。

14~22行目
「ItemBox」が保持すべきプロパティ情報を宣言します。ここでは「詳細」を表示するか否かのステータス情報を保持する「ShowDescription」を宣言しています。

24~58行目
「ItemBox」で使用するVPを宣言しています。「Name」「Mail」「Description」はテキスト表示要素、「Navigation」はひとつの要素だけを持つナビゲーションリンクです。このナビゲーション要素は「SWITCH_DESCRIPTION」というローカルイベントを発生させるように設定されていますが、表示文字列はブランクになっています。表示すべき文字列は「詳細」の表示状態によって変わるからです。

コード8-2

61行目
「ItemBox」が引き受けるGET変数の定義です。このVCはGET変数を引き受けないため、空配列を記述しておきます。

64~78行目
「ItemBox」がサブスクライブするイベント名と、各イベント名に対応するアクションメソッド名の定義です。「SWITCH_DESCRIPTION」を受け取った時には「switchDescription」、「CLEAR_LIST」を受け取った時には「clearItem」、「REFRESH」を受け取った時には「refreshViewData」を呼び出します。

コード8-3

85~109行目
イベント処理チェーンに入る直前に実行したい処理を「前処理」として記述します。「ItemBox」は生成されたときに表示すべき情報を受け取るため、その情報をVPプロパティに反映させる必要があります。またナビゲーションの表示文字列も「詳細」の表示状態に合わせて変更する必要があります。例えば「詳細」が表示されていないのであれば「詳細を表示する」、表示されているのであれば「詳細を隠す」にするわけです。ここではこれらの処理を行っています。

111~138行目
アクションメソッド「switchDescription」の処理内容です。このアクションメソッドは「詳細」の表示状態を切り替えます。まず現在の表示状態を「$this->getVcProperty」で取得し、その内容に応じて値をスイッチし、スイッチした値を「$this->setVcProperty」でセットします。またこの時、ナビゲーションの表示文字列も変更します。

140~144行目
アクションメソッド「cleaItem」の処理内容です。自分自身に割り当てられたSESSION変数の内容をアンセットします。これを行わないと「アイテムを登録」→「アイテムリストのクリア」→「再びアイテムを登録」を行った時にVC名が使い回されるため、古いSESSION変数が使用され、不適切な表示状態になる可能性があるからです。動的に生成され、VC名が使い回される可能性のあるVCでは、必ずこのような処理を行う必要があります。

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

コード8-4

HTMLテンプレートです。「ShowDescription」の内容によって「詳細(description)」の表示を切り替えています。

これでサンプルアプリケーションに必要なVCのコードがすべて揃いました。

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

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

PHP
2008.11.24
次に「ItemListBox」のコードを作成しましょう。このVCは「ItemBox」という「子VC」を持つという点が、大きな特徴になっています。

コード7-1

3~5行目
まずVCの親クラスをインクルードし「VcItemListBox」クラスを派生させます。

15~36行目
「ItemListBox」が保持すべきプロパティ情報を宣言します。ここではアイテムリストに含まれるアイテム数(ItemNum)と各アイテムの内容(ItemDataList)を用意しています。ItemDataListの内容は連想配列の配列であり、初期値は空配列となっています。

38~47行目
「ItemListBox」で使用するVPを宣言しています。「登録されているアイテム数:」の後に続く数字を文字列として表示するため、テキスト表示要素を用意しておきます。

コード7-2

50行目
「ItemListBox」が引き受けるGET変数の定義です。このVCはGET変数を引き受けないため、空配列を記述しておきます。

53~67行目
「ItemListBox」がサブスクライブするイベント名と、各イベント名に対応するアクションメソッド名の定義です。「ADD_ITEM」を受け取った時には「addItem」、「CLEAR_LIST」を受け取った時には「clearList」、「REFRESH」を受け取った時には「refreshViewData」を呼び出します。

コード7-3

74~86行目
イベント処理チェーンに入る直前に実行したい処理を「前処理」として記述します。「ItemListBox」は各アイテムの内容を表示する「ItemBox」を子VCとして生成する必要がありますが、その処理はここで行います。子VCの生成をVPのようにプロパティ設定で行うのではなく、前処理のアクションメソッドで行うのは、子VCの生成を「動的」に行いたい場合があるからです。例えばこの「ItemListBox」は、子VCとなる「ItemBox」の数が状況によって変わってきます。このようなケースでは、子VCを静的に生成することは困難です。
ここでは、SESSION変数によって引き継いだ「ItemDataList」の要素数に合わせて、「ItemBox_n(nは0から始まる番号)」を生成しています。VCを生成するメソッドは「addViewComponent」としてPnFによって定義されており、これにVC名、VCクラス、生成時のパラメーターを引数として渡します。各「ItemBox_n」にはアイテム内容のデータが必要なので、ここでは「ItemDataList」に格納されている各アイテムのデータを第3引数に設定します。

88~102行目
アクションメソッド「addItem」の処理内容です。「ADD_ITEM」イベントに付随するフォーム内容を受け取り、その内容を「ItemDataList」プロパティに追加します。複数の要素を持つことができるVCプロパティに新たな要素を追加する場合には、いったん「$this->getVcProperty」でプロパティ情報をローカル変数に取得し、そのローカル変数に新しい要素を追加した上で、「$this->setVcProperty」でプロパティ情報を上書きします。
さらにこのアクションメソッドでは、追加されたアイテムに対応するVCの追加を行っています。ここで注意しなければならないのは、イベント処理チェーンの途中で生成されたVCは、イベント処理チェーンに不完全な形で参加することになるということです。「REFRESH」だけは確実に受け取れますが、他のイベントを受け取れるかどうかは、生成されるタイミングに依存します。

104~111行目
アクションメソッド「clearList」の処理内容です。アイテムデータの内容をクリアし、アイテム数をゼロにセットします。

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

コード7-4

HTMLテンプレートです。「$this->getVpViewData」でVPのHTMLを取得しているだけではなく、「$this->getVcViewData」によって子VCのHTMLも取得し、$htmlに埋め込んでいることがわかります。これによって子VCの表示内容を、このVCの表示内容に統合しているわけです。

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

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

PHP
2008.11.24
次に「FormBox」のコードを作成しましょう。表示要素が「MenuBox」よりも多いので、記述もその分多くなります。いくつかに分けて見ていきましょう。

コード6-1

3~5行目
まずVCの親クラスをインクルードし「VcFormBox」クラスを派生させます。

15~22行目
「FormBox」が保持すべき情報を「$vcProperty」として宣言しています。プロパティ情報の宣言は、プロパティ名をキーとした連想配列として行います。連想配列の値の部分は、ふたつの要素を持つ連想配列になっています。
ひとつめの要素のキーは「sync_session」であり、この値に「TRUE/FALSE」を設定することで、プロパティ情報をSESSION変数と同期させるか否かを指定します。SESSION変数に同期させることで、このプロパティ情報を複数の画面で「継続的に」使用できるようになります。
ふたつめの要素のキーは「filtered_value」です。ここにはプロパティ情報の内容を設定します。スカラー値はもちろんのこと、配列や構造体をプロパティ情報として設定することも可能です。
なおこの「FormBox」では、BOXの表示状態(表示/非表示)を記憶するために「DisplayMode」というプロパティ情報を設定しています。デフォルト値は'display:none'という文字列です。これをVCのHTMLテンプレートに埋め込むことで、表示/非表示をコントロールするわけです。

コード6-2

25~84行目
「FormBox」で使用するVPを宣言しています。各VPは以下の機能を持ちます。

NameField:「名前」欄の入力フィールドです。データタイプは「TEXT」、IMEモード(仮名漢字変換機能)はアクティブ、フィールドのサイズは25文字、入力可能な最大文字数は255文字に設定されています。文字列の初期値は''です。

NameErrorMessage:「名前」欄の入力に問題があったときに、エラーメッセージを表示するテキスト表示要素です。初期値は''です。

MailField:「メールアドレス」欄の入力フィールドです。データタイプは「MAIL」、IMEモードは非アクティブ、フィールドのサイズは25文字、入力可能な最大文字数は255文字に設定されています。初期値は''です。

MailErrorMessage:「メールアドレス」欄の入力に問題があったときに、エラーメッセージを表示するテキスト表示要素です。初期値は''です。

DescriptionField:「詳細」欄の入力フィールドです。ここではテキストエリアを使用しています。ime_mode、wrap、cols、rowsの意味はHTMLのテキストエリアの各属性と同じものです。

Navigation:「登録」「キャンセル」のナビゲーションに使用するリンクです。「登録」をクリックすると「ENTER」というローカルイベントが発生します。「キャンセル」をクリックすると「CANCEL」というローカルイベントが発生します。

コード6-3

87行目
「FormBox」が引き受けるGET変数の定義です。このVCはGET変数を引き受けないため、空配列を記述しておきます。

90~108行目
「FormBox」がサブスクライブするイベント名と、各イベント名に対応するアクションメソッド名の定義です。「OPEN_ENTRY_FORM」を受け取った時には「openForm」、「ENTER」を受け取った時には「execFormEntry」、「CANCEL」を受け取った時には「cancelFormEntry」、「REFRESH」を受け取った時には「refreshViewData」を呼び出します。

コード6-4

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

118~121行目
アクションメソッド「openForm」の処理内容です。このアクションメソッドは「自分自身を表示する」というものなのですが、実際のHTML生成は後述のテンプレートに任せることになるので、ここではプロパティ情報の変更だけを行います。つまり15~22行目で記述した「DisplayMode」の値を「display:block」にするわけです。VCプロパティ情報の変更は「setVcProperty」で行います。このメソッドはVCの親クラスで定義されているので「$this->」を頭に付けて呼び出します。

コード6-5

123~168行目
アクションメソッド「execFormEntry」の処理内容です。このアクションメソッドは、入力フィールドの内容をチェックし、エラーがなければ「ADD_ITEM」イベントを発生させ、エラーがあればエラーメッセージを表示(VPにセット)します。
イベントを発生させる時には、第3引数にサブスクライブ側に引き渡したいデータセットを指定できます。ここではフォームの内容を格納した構造体を作成し、これを第3引数に指定しています。これでイベントを受け取る側は、フォームの内容を受け取ることができるわけです。
VPへの値のセットは「$this->setVpProperty」で行います。引数は「VP名」「プロパティ名」「プロパティ値」です。例えば「NameErrorMessage」というVPの「filtered_value」に文字列をセットするには、151~153行目のような記述になります。
なお入力チェック処理の内容は、後述する別メソッド「checkInputValue」で定義されています。

コード6-6

170~180行目
アクションメソッド「cancelFormEntry」の処理内容です。フォーム内容をクリアし、フォームを非表示にします。

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

コード6-7

185~231行目
入力チェック処理のメソッドです。VCが自分自身の中だけで使用するメソッドはprivateで宣言します。
入力フィールドに入力された内容は、イベント処理チェーンが始まる前にPnFコアによってチェックされ、各VPの「check_status」プロパティにセットされています。どのような内容がセットされるのかはフィールドのデータタイプによって若干異なります。例えば入力フィールドに何も入力されていなければ「NULL」、使用できない文字が混ざっていた場合には「INVALID_STRING」がセットされます。他にも「INVALID_TYPE(データ型が異なる)」「TOO_SMALL(設定された最小値よりも小さい))」「TOO_BIG(設定された最大値よりも大きい)」「TOO_SHORT(設定された最小文字数よりも文字数が少ない)」「TOO_LONG(設定された最大文字数よりも文字数が多い)」が用意されています。問題がない場合には「VALID」がセットされます。

コード6-8

236~277行目
HTMLテンプレートです。248行目でVCプロパティの「DiaplayMode」の値、250~261行目で使用しているVPのHTMLテンプレートを取得し、$htmlの中に埋め込んでいます。この$htmlの値が、このVCのHTML記述になります。

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

FC2Ad

相続 会社設立

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