sample

動作サンプル

まず動かしてそれから覚える。これがDOLEM流の覚え方です。
ということでここでは様々な形のサンプルを用意していきます。
簡単なものから難しいものまで色々と用意していくつもりですので自分のLvにあったものや、やりたいものに即したものを適当に試していってみて下さい。
サンプル毎に「ここだけは覚えて帰ってもらいたい」ポイント解説もつけています。
参考までに大まかなLvもつけておきました。

Lv1.計算処理と画面出力

DOLEMの基本的な動きを理解するためのものです。
用意するファイルは2つです。

区分:model

dolem/core/model/user/sample/mvc.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        mvc.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2012/12/23        xirasaya        1.00        create new
  15. //****************************************************************************** 
  16. @loglog(basename(__FILE__));
  17. ############################################################60
  18. ## execute...
  19. ############################################################
  20. #
  21. $template = new template();
  22. #
  23. ############################################################60
  24. class template extends BaseModel {
  25.     
  26.     function init() {
  27.         return true;
  28.     }// end function
  29.     function main() {
  30.         
  31.         $num = 1 + 2;
  32.         $this->set('num', $num);
  33.         
  34.         return true;
  35.     }// end function
  36.     function disp() {
  37.         
  38.         $layout = VIEW_DIR_PATH. '/'.general('c').'/sample/mvc.php';
  39.         include($layout);
  40.         return true;
  41.     }// end function
  42. }// end class
  43. ?>

区分:view

dolem/core/view/user/sample/mvc.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        mvc.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2012/12/23        xirasaya        1.00        create new
  15. //******************************************************************************
  16. ?>
  17. <html>
  18. <body>
  19.     <?=$this->get('num')?>
  20. </body>
  21. </html>

二つのファイルを用意したらブラウザから早速アクセスしてみましょう。
アクセスURLは、
http://{{ホスト名}}/?m=sample/mvc
となります。

動作結果

3

解説

最初のこのサンプル。
最初なのでまずはサンプルの見方から説明しないといけないな。
ではパスの見方から。

図1

うん、説明不要ですね。ファイルまでの内部パスです。
適時自分の環境にあったパスに読み替えて実装して下さい。

次に図2を見てください。

図2


区分modelと区分viewですが、それぞれパスの中にmodelviewという単語が出てきています。
これがそれぞれMVCモデルMVにあたります。

基本的にmodelとviewのファイル名は同じになるようにして下さい。別々の名前にするとわかり辛くなりますので。
最初はmodelファイル1に対してviewファイルが1だと思ってくれれば結構です。あくまでも基本ですが。

「MVCモデルのMとVはわかった。じゃあCはどこにあるの?」と思った人。せっかちです。その内出てきますよ。
とりあえずここではMとVを確実に覚えて帰って下さい。


さて次にmodelファイルを見ていきます。
modelファイルは主に処理(プログラム)を担う役割をもっています。
modelファイルは基本的に全て共通するコピペです。
違う点は以下の点のみになります。
図3を見て下さい。

図3

クラス内にfunctionが3つ定義されているのが確認できます。
それぞれinit()は入力チェックmain()がメイン処理disp()は画面出力に関するプログラムです。
この関数は自動的にinit()、main()、disp()の順に実行されていきます。
まあ最初は「上の関数から順に中身が処理されていくのね」くらいに覚えておけばいいでしょう。

ではその処理内容を上から順に見ていきましょう。
init()ですが、今回は入力チェックは必要ないのでの中身は何もせず関数の最後でtrueを返すだけになっています。

main()では計算した結果$numを$this->set('num')というものを使ってなにやらセットしています。
こちらも関数の最後でinit()と同じようにtrueを返しています。

最後にdisp()
$layoutなるものにパスが格納され、その直後にincludeしています。
これは毎回こう書くお約束と思って下さい。早い話がviewファイルをここで読み込んでいるだけです。
こちらも他の関数と同じようにやはり最後にtrueを返しています。

以上でmodelファイルに関しては終わりです。
簡単でしたね。


次にviewファイルを見ていきましょう。
viewファイルは主に画面(デザイン)を担う役割をもっています。
図4を見て下さい。

図4

これこそ何も言うことがありません。
単純なHTMLの中でPHPのショートタグを使って$this->get('num')を呼び出しているだけです。
ただしファイル自体はPHPファイルであることに注意して下さい。

さてこの$this->get('num')で指定している名前は、modelファイルのmain()の中でセットするのに使った名前と同じ'num'であることに気がついたでしょうか。
そう、modelファイルとviewファイルはそれぞれ独立したスコープを持っている(※)ので関数内で作った変数を別の関数内で持ちまわすことができません。
※正確にはmodel内のinit()とmain()とdisp()のスコープが、です。

このスコープを超えて値を持ち回すのに$this->set()$this->get()というものを使うのです。
これで必要な値を保存し必要な場所で取り出すことができるのです。←ここ重要
こうすることでどの値が本当に必要な値であるかが明確にもなります。

そしてこれが処理(プログラム)画面(デザイン)分離に繋がります。
つまりプログラマmodelファイル内で仕事を済ませ結果のみを渡すことができるので、デザイナviewファイルでグダグダと長い処理を目にしなくてすみます。
またプログラマもデザイナもお互いが同じファイルを触ることが減るので作業効率がグンと上がります。

さらに、リリース後のデザイン変更などが入った場合もviewファイルのみを触ればデザイン修正をすることが可能となってきます。
これはデザイン修正によってプログラムの新たなバグを発生させない上でも非常に重要です。

こういった理由からデザイナが扱うviewファイル内に処理(プログラム)を書くことは好ましくありません。
ですので、viewファイル内に渡す値は、予めmodelファイル内で処理をしておき結果の値$this->set()を使ってセットしておきましょう。
あくまでもviewファイルでは値のみを取り扱うようにして下さい。
繰り返しになりますがviewファイル内で計算処理などをしないように心がけておいて下さい。

ただしこれはあくまでも理想の考えであって必ずしもそうしなくてはならないというものではありません。
現実的には処理と呼ばれるものもviewファイルにかかざるを得ないような場面も多く発生します。
まあこの辺りはおいおい書いていくこととしましょう。


まとめ

  • modelファイルはMVCモデルのM、viewはMVCモデルのVにあたるものである。
  • modelファイルは処理(プログラム)の役割を担うものである。
  • modelファイルの雛形は基本コピペで作るべきである。
  • modelファイルにはinit()の入力チェック、main()のメイン処理、disp()の画面出力の3つがある。
  • modelファイルの関数はinit()、main()、disp()の順に中身が実行されていく。
    ※この際init()、main()、disp()は戻り値としてreturn true;とする必要がある。
  • modelファイル内でスコープを超えて値を持ち回すには$this->set()を使う。
  • viewファイルは画面(デザイン)の役割を担うものであり、主にHTMLを記述するところである。
  • viewファイル内で、modelファイル内で保持した値を利用するにはPHPショートタグと$this->get()を使う。
  • viewファイルに渡す値は処理結果の値のみに限定しviewファイル内で計算処理などを行わない。

こんなところでしょうか。
MVCモデルを理解している人にとってはややくどい説明になってしまいましたね。
実際に実装していくとmodelファイルのinit()、main()の2つに役割をもたせ機能を実装することになります。
他のサンプルを実装していけばこの意味もすぐに理解できるでしょう。
なに、まだ一つ目のサンプルです。いきなりここで全て理解する必要はありませんし何も焦ることはありません。


※modelファイルではBaseModelクラスを継承したtemplateクラスを毎回利用します。
※このクラス内でinit()、main()、disp()は必ず定義しなくてはならない関数であることに注意して下さい。
※init()、main()、disp()の戻り値としてtrue か falseを返して下さい。trueにすると次の処理へ進み、falseとするとその関数で処理は終わります。


[top]