sample

動作サンプル

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

Lv4.Postデータを一時的に保存する

クラスプロパティの保存と復元の基本的な動きを理解するためのものです。
用意するファイルは4つです。

まず最初に2つ。

区分:model

dolem/core/model/user/sample/session.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        session.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2013/03/27        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.         //========================================40
  28.         // prepare
  29.         //========================================
  30.         $PostClass = PostClass::newInstance();
  31.         $GetClass = GetClass::newInstance();
  32.         
  33.         //----------------------------------------40
  34.         // 次画面よりback
  35.         //----------------------------------------
  36.         if($GetClass->get('back')==='1') {
  37.             $chk = $PostClass->removeSession('hoge'); // 復元
  38.             $this->set('chk', $chk);
  39.         }// end if
  40.         
  41.         return true;
  42.     }// end function
  43.     
  44.     function main() {
  45.         return true;
  46.     }// end function
  47.     
  48.     function disp() {
  49.         
  50.         $layout = VIEW_DIR_PATH. '/'.general('c').'/sample/session.php';
  51.         include($layout);
  52.         return true;
  53.     }// end function
  54.     
  55. }// end class
  56. ?>

区分:view

dolem/core/view/user/sample/session.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        session.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2013/03/27        xirasaya        1.00        create new
  15. //******************************************************************************
  16. $PostClass = PostClass::newInstance();
  17. ?>
  18. <html>
  19. <body>
  20.     <h1>Page.1</h1>
  21.     <div>入力フォームに文字を入力して下さい。</div>
  22.     <form action="<?=HTTP_BASE_URL?>/?m=sample/session2" method="post">
  23.         <input type="text" name="txt_1" value="<?=$PostClass->get_h('txt_1')?>" maxlength="10" /><br />
  24.         <input type="submit" name="btn_submit" value="submit" /><br />
  25.     </form>
  26.     
  27.     <div>結果</div>
  28.     <?php
  29.     if($this->get('chk')) {
  30.     ?>
  31.     セッションからPostClassを復元しました。<br />
  32.     PostClassに <?=$PostClass->get_h('txt_1')?> というデータが復元されました。<br />
  33.     <?php
  34.     }else {
  35.     ?>
  36.     現在の結果はありません。<br />
  37.     <?php
  38.     }// end if
  39.     ?>
  40. </body>
  41. </html>

さらに続けて2つ。

区分:model

dolem/core/model/user/sample/session2.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        session2.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2013/03/27        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.         //========================================40
  28.         // prepare
  29.         //========================================
  30.         $PostClass = PostClass::newInstance();
  31.         
  32.         //----------------------------------------40
  33.         // 入力値チェック
  34.         //----------------------------------------
  35.         // TODO: 通常ならばここで入力チェックを行います
  36.         
  37.         $PostClass->toSession('hoge'); // 保存
  38.         
  39.         return true;
  40.     }// end function
  41.     
  42.     function main() {
  43.         return true;
  44.     }// end function
  45.     
  46.     function disp() {
  47.         
  48.         $layout = VIEW_DIR_PATH. '/'.general('c').'/sample/session2.php';
  49.         include($layout);
  50.         return true;
  51.     }// end function
  52.     
  53. }// end class
  54. ?>

区分:view

dolem/core/view/user/sample/session2.php
  1. <?php if(!defined('IS_INITIAL_INCLUDE')) exit('Directory access is forbidden.');
  2. //******************************************************************************80
  3. // <<FileName>>
  4. //        session2.php
  5. //
  6. // <<Summary>>
  7. //        
  8. //
  9. // <<Details>>
  10. //        
  11. //
  12. // <<RevisionHistory>>
  13. //         [Date]            [Author]        [V/R]        [Subject]
  14. //        2013/03/27        xirasaya        1.00        create new
  15. //******************************************************************************
  16. $PostClass = PostClass::newInstance();
  17. ?>
  18. <html>
  19. <body>
  20.     <h1>Page.2</h2>
  21.     
  22.     <div>結果</div>
  23.     PostClassに <?=$PostClass->get_h('txt_1')?> というデータが渡されました。<br />
  24.     セッションに現在のPostClassを保存しました。<br />
  25.     <br />
  26.     <a href="<?=HTTP_BASE_URL?>/?m=sample/session&back=1">Page.1に戻る</a>
  27.     
  28. </body>
  29. </html>

アクセスURLは、
http://{{ホスト名}}/?m=sample/session
となります。

動作検証

http://dolem.jp/?m=sample/session
このサンプルを実行すると2つのページを行ったりきたりすることができます。
Page.1で入力した値がPage.2で保存されます。
Page.2のリンクからPage.1に戻ってくると先ほど入力した値が復元されます。

解説

では、それぞれのmodelとviewの動きをみていきましょう。
まず最初に用意したmodelのsession.phpから。
図1を見てもわかるようにmain()の中では特に何もしていません。

図1

init()では何かやっているようですがひとまずおいておきましょう。


次にviewのsession.phpの解説に移ります。
図2ではinput要素のvalue属性に$PostClassが埋め込まれています。

図2

$PostClassはフォームから送られた値を取得したりするのに使うオブジェクトですから、まだ何もPOSTされていない時では何も取得することはできません。
つまり現段階では$PostClass->get_h('txt_1')は''(空文字)が返ってきています。
ここでは、form要素のmethod属性の値が'post'になっていることと、input要素のname属性が'txt_1'となっていること、
そしてそのvalue属性ではそれら両方を組み合わせたものが指定されていることがわかればOKです。
このフォームのsubmit先は/?m=sample/session2となっています。
正確には$PostClass->get('txt_1')ではnull値が、$PostClass->get_h('txt_1')では''(空文字)が返ってきます。
これはget_h()は内部的にはhtmlspecialchars($PostClass->get('txt_1'))としているからです。


次にmodelのsession2.phpを見てみましょう。
これは先ほどのフォームのsubmit先となります。
図3のinit()を見て下さい。

図3

最初にPostClassをインスタンス化することで、POSTされた値を$PostClassで触れるようにしています。
その後、$PostClass->toSession({任意の名前})でその時点でのPostClassの状態をセッションに保存しています。
これをDOLEMではクラスプロパティをセッションへ保存するという言い方をします。

このようにして保存されたクラスプロパティは$PostClass->fromSession({任意の名前})などとすることでPostClassの状態を復元することができます。 復元についてはPage.1(modelのsession.php)に戻ったときに行っていますので後ほど解説します。


次にviewのsession2.phpをみてみましょう。
図4を見て下さい。

図4

$PostClass->get_h('txt_1')というのは図2でやった呼び出し方と同じです。
POSTされた値が表示されます。
2つ目の下線ではPage.1へのリンクを埋め込んでいるだけです。
この時&back=1としています。これがクラスプロパティ復元のトリガー(きっかけ)となります。


最後にもう一度modelのsession.phpを見て下さい。
先ほどのPage.2のリンクを踏んでここに戻ってきました。
今度はちゃんとinit()を見てみましょう。
図5はinit()の中身です。

図5

このif文は$GetClass->get('back')の値が1の時のみ真となります。
そして次の行で行っている$PostClass->removeSession({任意の名前})セッションからクラスプロパティの復元を行っています。
これは$PostClass->fromSession({任意の名前})でも同様の結果となりますが、異なる点は、 $PostClass->fromSession({任意の名前})はセッションからクラスプロパティの復元のみを行うのに対して、 $PostClass->removeSession({任意の名前})はセッションからクラスプロパティの復元と同時にセッションの破棄を行うという点です。
このセッションの破棄をしない限り何度でも任意のタイミングでセッションからクラスプロパティの復元を行うことができますが、いずれはゴミとして残ることになります。
なお、$PostClass->clearSession({任意の名前})でセッションからクラスプロパティを復元させずに破棄のみ行うこともできます。
つまり$PostClass->fromSession()と$PostClass->clearSession()を一度に行うのが$PostClass->removeSession()ということになります。

一度利用したセッションは大抵もう利用することはありませんので通常は$PostClass->fromSession()より$PostClass->removeSession()を使うことの方が多いと思います。


まとめ

  • $PostClassが持つキーと値の状態はクラスプロパティというもので管理されている。
  • クラスプロパティを保存しておくことで任意のタイミングで復元(保存した時と同じ状態)に戻すことができる。
  • クラスプロパティの保存と復元はセッションを利用している。
  • クラスプロパティの保存は{オブジェクト変数}->toSession({任意の名前})でセッションに保存される。
  • クラスプロパティの復元は{オブジェクト変数}->fromSession({任意の名前})でセッションから復元される。
  • セッションの破棄は{オブジェクト変数}->clearSession({任意の名前})で行うことができる。
  • {オブジェクト変数}->removeSession({任意の名前})でクラスプロパティの復元とセッションの破棄を一度に行うことができる。


[top]