九分九厘、index.phpとかいう名前になりますが、別に固定ではありません。
中身は多くの場合
<?php
// MW config
require_once('mw.confへのフルパス');
// config
$bp = 基準ディレクトリ;
$config = $bp . 'configファイルの位置';
//
require_once('controller.inc');
//
$cobj = new controller;
$cobj->set_base_path($bp);
$cobj->set_config($config);
$cobj->run();
最低限必要なのは以下のとおりです。
# 入力(内部処理エンコーディング) inside_encoding_type = EUC # 出力 output_encoding_type = SJIS
いやまぁ内部UTF-8でもよいのですが、なんとなくEUCのほうが実績が多いのでEUCにしてます。
出力は、PC系ならUTF-8のほうがベターかと。携帯系だとsjisでほぼ決まりですね現状。
# map ファイル mapping_file_path = マップファイルをフルパスで
MVCのmodelを決め打ちしてるファイルなので、これがないといろいろ始まりません。
mapファイルの書式
# DB設定 db_config_path = DB設定ファイルをフルパスで
DB使うならほぼ必須だと思ってください。
なお、このファイルにはDB接続のパスワードが書いてあるので。documentroot以下に置くのは厳禁です。
DB設定ファイルの書式
# 共通ルーチンが入っているPath。include_pathにくっつけてもらえるから便利。 # マッピングファイルに書かれているビジネスロジックの場所 common_include_dir = 基準になるディレクトリ。最後は'/'で終わりませう。
基準になるディレクトリをひとつだけ指定しませう。
# テンプレートファイル template_dir = テンプレートが入ってるディレクトリ。最後はやっぱり'/'で。
HTMLテンプレートが入ってるディレクトリ名をここで指定します。
# 認証config session_config = 認証設定ファイルをフルパスで
認証系の場合、自力でどうにかしてもよいのですが、この設定ファイルを使うとめっさ便利です。
認証configの書式
configファイルをまとめると大体こんな感じです。
# 入力(内部処理エンコーディング) inside_encoding_type = EUC # 出力 output_encoding_type = SJIS # map ファイル mapping_file_path = マップファイルをフルパスで # DB設定 db_config_path = DB設定ファイルをフルパスで # 共通ルーチンが入っているPath。include_pathにくっつけてもらえるから便利。 # マッピングファイルに書かれているビジネスロジックの場所 common_include_dir = 基準になるディレクトリ。最後は'/'で終わりませう。 # テンプレートファイル template_dir = テンプレートが入ってるディレクトリ。最後はやっぱり'/'で。 # 認証config session_config = 認証設定ファイルをフルパスで
適当なmodel基底クラスを継承します。多分、普通ならbase_model、認証系ならbase_model_authってところでしょう。更なる基底としてbase_model_skeletonがありますので、必要に応じてお好みに。
とりあえず(ほぼ)共通する内容なので、まとめて。
public function initialize() { }
public function finalize() { }
modelクラスのインスタンスが生成されるタイミング&破棄されるタイミングでcallされます。再帰callの場合入れ子でcallされます。…が、まず確定で「処理必要ない」と思います。
基底クラスでabstract宣言してるので、実装だけはしておいてください。
public function execute()
public function execute_auth()
このどちらかのメソッド(名前みれば一目瞭然ですが、authついてるほうが認証系です)がいわゆる「マウントポイント」になります。ので、処理はこのメソッドを起点にしてください。
で、実際必要なのはこのインスタンス内で持ってるエトセトラだと思うので、いくつかかいつまんで。
$_POSTとか$_GETとか、あまつさえ$_REQUESTなどを生でcallするのは厳禁です。厳禁ですったら厳禁です(理由は省略。とりあえず、magic_quoteとロギング関連と文字コードという単語から適宜妄想してください)。
上述のリクエストはすべて、cgi_requestクラスがまかないます。とりあえず
$req = $this->get_cgi_request();
$s = $req->find(cgiでの名前);
$array = $req->find_array(cgiでの名前);
$dbh = $this->get_db();
でどうぞ。あとは、このハンドルにqueryとかいうメソッドを使うと簡単にDBにアクセスできます。
なお、基本的には「model内でダイレクトにSQL書くのは厳禁」です。そーゆー処理はクラスに弾いてラッピングしておきませう。
CONV使用前提です。で、
$conv = $this->get_conv();
auth限定ですが。
$id = $this->get_id();
前提であれば、
$this->make_body_with_conv(テンプレートファイル名);
hiddenはとりあえず(ほぼ)論外として。
セッション情報は、session_dataクラスからの派生クラス(普通はsession_data_dbクラス)を使って格納してください。
require_once("session_data_db.inc");
$sb = new session_data_db;
$sb->set_db(DBハンドル);
$sb->set_id(個人が特定できるようなID);
が大前提。直前にデータがある可能性があれば、この後で
$sb->read();
$sb->fix_session();
データは
$sb->add("name1","value1-1");
$sb->write();
使い終わったら行儀よく
$sb->del();
SQLを(万が一)手で作るときは、sql_utilまたは最低でもsecurityクラスを使ってきちんとエスケープ処理をしてください。
convに出力用置換データを渡すときもsecurityクラスでのエスケープを忘れずに(これは、後でsecurity_convとか作るかもしれないですが)。
data_clumpの派生クラス…ではなくて。data_clump_valudatorの派生クラスを用意します。
自力で書くのもありですが。ぶっちゃけ、junk box http://www.gjmj.net/ にある data_clump_validator作成 http://www.gjmj.net/make_clump.php 使うほうが楽かもです。
フォロー必要ならコメントよろしく(笑
端的に書くと「validatorもしてくれるclump」です。そのまんま。
現状実装してるtypeは
any 種類問わず
alphanum 英数字
numeric 数値:minとmaxの意味合いが変わる
email email
url URL
digit 数字
dir ディレクトリ
くらい。
alpha 英字
alpha_lower 英小文字
alpha_upper 英大文字
xdigit 16進数の数字
tel
jzip 日本の郵便番号
については実装する…かもしれない。ので、欲しい人は挙手。
完了はともかく、入力と確認はそこそこ面倒。特に入力画面は「エラー画面兼任」なので厄介。
厄介なら自動化ってことで validator_util_with_conv で使えるテンプレ自動作成 http://www.gjmj.net/make_template.php をどんぞ。
以下メモ。 性別 <INPUT type="radio" name="customer_sex" value="***sex:1***">男 <INPUT type="radio" name="customer_sex" value="***sex:1***">女<br>
チェックボックスも似たような書式。
都道府県はjunk boxにしまってある。
base_model(素)なりbase_model_auth(認証必須)なりbase_model_ambiguous(認証してもしなくても)なり、それぞれのwith_mobileなりを適宜継承。
$tmp_name = "てんぷれのファイル名";
$conv = new f_conv;
// 出力
$this->make_body_with_conv($tmp_name);
中身はとりあえずこんなもん。ここまでで一回test。エラーつぶして。mapfileとか書き忘れてない? 大丈夫?
テンプレはjunk boxで作れるので。単純にまずは遷移できることを確認。
XXX
入力チェック。validator_util_with_convのcheckメソッドで。
突っ返すときは$convにはすでに情報入ってるしbag機能で持ちまわれるので
$this->recursive_on();
$this->set_recursive_command(つっかえすコマンド多分input);
//
return ;
で。
以下書いてない orz