OpenPNEのMVC・モデル、ビュー、コントローラーの関係

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

MVCフレームワークでは、URLのクエリにより、コントローラーのアクションが決定される。
OpenPNEの場合、たとえば、日記投稿ページのクエリは・・・

スポンサーリンク

?m=pc&a=page_h_diary_add

となっていて、このクエリにより、コントローラーのアクションが決定されます。
このクエリの場合、m=pc が、PC版のOpennPNEの動作(携帯の場合、m=ktai)、a=page_h_diary_add は、page(コントローラー)のh_diary_add(アクション)を呼び出す、という意味のクエリとなります。

Controller(コントローラー): page

上記のクエリは、次のファイル(コントローラー)を呼び出す。
webapp/modules/pc/page/h_diary_add.php

このファイルの中では、テンプレートに渡すための変数名が、以下のようにセットされます。
$this->set(“date_val”, $date_val);
$this->set(“category_list”, db_diary_category_list4c_member_id($u));
これで、$date_val や $category_list という変数が、templates以下のSmartyテンプレートファイルで使えるようになる。
db_diary_category_list4c_member_id($u) は、DB操作の独自関数で、
webapp/lib/db/hoge.php で定義されており、拡張する場合は、このディレクトリ(webapp/lib/db/)に、拡張用のDB操作関数を、任意の名前のファイルで作ります。
lib/db 以下に作ったファイルは、自動で読み込まれるようになっているようです。

DB周りの操作は、コントローラーに書いても良いのですが、MVCの考え方からすると、可能なものはModel に書いたほうが好ましいと思います。
特に、データベースの中身を更新するような処理は、モデル(doディレクトリのファイル)に書くようにする。

View(ビュー): templates

レンダリングには、Smartyが使われてて、
webapp/modules/pc/templates/h_diary_add.tpl
がテンプレートになっています。
先ほど、page/h_diary_add.php の$this-set のコントローラーでセットされた変数($date_val や $category_list)を使えるようになります。
変数が配列の場合は、Smartyタグのforeachとかで配列を回して表示。

変数がDBテーブルのレコードオブジェクトとして返っている場合、$category_list.hoge, $category_list.fuga などと、hoge, fuga などテーブルのカラム名がDBオブジェクトのインスタンス変数(メンバ変数)になってるんで(?たぶん)、レコードオブジェクト変数名.(ドット)カラム名でテンプレートでアクセスできる。(間違っていたらすいません。)

Model(モデル): do

データベース周りはPEAR・DBライブラリが採用してあります。
データベースの更新処理は、基本的にはモデルで操作するようにします。
webapp/modules/pc/do

doディレクトリには、レンダリングしない、すなわちテンプレートがなくて、リダイレクトで元のページに戻すファイルも多く含まれています。
事実、do/h_diary_add.php という名前のファイルは存在せずに、h_diary_add_insert_c_diary.php という名前のファイルがある。
この、h_diary_add_insert_c_diary.php が日記の新規投稿や編集更新を担います。

基本的には、doでは、リクエスト変数($request)を受け取り、データベースを更新したり、メールを送信したり、などを行い、元のページへリダイレクトという流れの処理が多いようです。

以上が、OpenPNEの基本的なMVC動作の基本です。

スポンサーリンク
 
スポンサーリンク