忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/20 11:52 |
PHP1-84:クラスっぽい投稿フォーム作る


ずいぶん適当な投稿フォームを作りましたが、昨今流行りのクラスを使ってたらりんと書き換えていきましょう。

フォルダ構成はこんなかんじ
/Smarty/(Smarty構成ファイル)
/form/htdocs/index.php
     /lib/index.php
     /templates/(テンプレ)
     /templates_c/(テンプレのキャッシュ置き場)


/form/htdocs/index.php

1
2
3
4
5
6
7
<?php
    
    //必要なファイルをインクルード
        require_once('../lib/index.php');
    
    //実行
        $form=new HtmlForm();

htdocs/index.phpはDocumentRoot外に出ている唯一のファイルで、万一サーバの設定ミスとかでPHPが処理できない場合でもソースの流出を最小限に抑えます。
あとclassの上にnewを書くとうまく動かないことがあったりなかったりするので、分かれている方が安心。

というわけでlib/index.phpに実際の中身を書いていきます。

/form/lib/index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
    
//=========================================================================
//準備
    
    //根本のフォルダ
        $base_dir=dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR ;
        define('BASE_DIR',$base_dir);
    
    //必要なファイルをインクルード
        require_once('../../smarty/libs/Smarty.class.php');
 
//=========================================================================
//クラスclass HtmlForm{
    
    //-------------------------------------------------------------------------
    //インスタンス変数等
        
        //Smartyテンプレ、キャッシュ置き場
            private $smarty_template_dir='../templates/';
            private $smarty_compile_dir='../templates_c/';
    
    //-------------------------------------------------------------------------
    //コンストラクタ
    public function __construct(){
        
        //Smarty
            $this->smarty=new Smarty();
            $this->smarty->template_dir = $this->smarty_template_dir;
            $this->smarty->compile_dir  = $this->smarty_compile_dir;
        
        //実行メソッドを呼ぶ
            $this->init();
            exit();
    }
    
    //-------------------------------------------------------------------------
    //実行
    public function init(){
    }
    
    //-------------------------------------------------------------------------
    //表示
    public function view($template_file='index.html'){
        
        //変数アサイン
            //$this->dataに突っ込めば$dataで表示できるようにします
                $this->smarty->assign('data',$this->data);
            //$_REQUESTは常時参照可能
                $this->smarty->assign('request',$_REQUEST);
        
        //表示
            $this->smarty->display($template_file);
            exit();
    }
    
    //-------------------------------------------------------------------------
    //投稿内容一覧画面
    public function FormIndex(){
    }
    
    //-------------------------------------------------------------------------
    //フォーム入力画面
    public function FormInput(){
    }
    
    //-------------------------------------------------------------------------
    //フォーム入力完了画面
    public function FormComplete(){
    }
    
    
    //=========================================================================
    
    //-------------------------------------------------------------------------
    //サブルーチン//入力値チェック
    public function _FormValidate(){
    }
    
    //-------------------------------------------------------------------------
    //サブルーチン//エラーコードを入れておく
    public function _FormSetErrorCode(){
    }
    
    
//クラスのおわり
}

別にクラスの利用法とか勉強したわけじゃなく概ね自己流なので本職から見たらこんなのクラスじゃねえとかいわれるのかもしれませんが、さくっと大まかな形だけを整えた状態です。

__construct()やview()、BASE_DIRの定義なんかは基底クラス、定義ファイルとしてどっかに置いておき、実装でそれをrequire_onceなりextendsなりして作成した方が使い回しも効いて便利なんですが、今回はまあいいや。
実際__construct()内の$this->init()なんてこの使い方では全く意味がありません。
スーパークラスにabstract function init()とか書いておいてオーバーライドするのが定石です。

具体的な実装は何も書いていませんが、とりあえずこれでもエラーは出ません。
後は個々のメソッドを埋めていけばそのうち動くようになります。
このようにアバウトな作り方で進められるのもOOPの利点の一つだと思います。
はっ、これがもしかして伝説のエクストリームプログラミング?(多分違う)
PR


2009/08/10 20:27 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-85:クラスっぽい投稿フォーム作るその2 | HOME | ZF-01:モジュールを使ってみる:Zend_Date>>
忍者ブログ[PR]