[memovie] 自作フレームワークについてとフォームからのPOST
|
memovie.orgのコーディングです。今まで触れてこなかったフォームでのデータのやりとりについて書いてみます。
svn checkout http://svn.coderepos.org/share/websites/memovie.org/trunk memovie.org/trunk
Subversionの使える環境で上記のようにコマンドを打てばダウンロードできます。一度ダウンロードしたらsvn upとすれば最新のソースがダウンロードされます。
まず必要な設定は、public/をapacheのドキュメントルートにすること。
例えばsvn checkupを/home/funaki/work/で実行した場合、こんな具合。.htaccessも有効にしておきます。
DocumentRoot "/home/funaki/work/memovie.org/trunk/public"
続いてPHPの設定。apacheの設定ファイルに記述するのであればAllowOverRide All
php_value include_path '.:/home/funaki/work/memovie.org/trunk/'
とtrunkにパスを通しておきます。php.iniの設定は、CentOSなどにPHPを入れた際のデフォルトを想定していますがmagic_quotesはOffです。
magic_quotes_gpc = Off
.htaccessにmod_rewriteの設定があるので、僕の環境の場合、
http://memovie/ にアクセスするとpublic/index.phpが呼び出されます。(apacheのVirtualHostで ServerName memovie としつつアクセスするクライアントの/etc/hosts で127.0.0.1 memovieを指定。Windowsでもhostsの設定でできます)
public/index.phpのソースを見るとControllerがnewされてexecute()を呼び出しています。
lib/Controller.phpのfunction execute()ではあれこれ処理が施されていますが、URLの/以下によって呼び出すクラスを変える、というものです。
http://memovie/post
ならapp/controllers/Post.phpを呼び出す、といった具合です。呼び出してexecute()した返り値はapp/views/post.phpで出力できます。
複雑なファイル構成になっていますがこれは、PHPの各ファイルとその役目を明確に分けるための仕組みです。app/controllers/ にはメインの処理を、app/views/ には出力部分(HTML)を、まだ登場していませんがapp/models/ にはデータベースとのやりとりを記述します。MVCモデルと呼ばれ、近年のスタンダードなフレームワークの手法です。詳細が気になる方は検索してみてください。
さて、ウェブサイトの多くではHTMLの<form>を使ってデータをサーバに送信します。
<form action="" method="post">
これが基本的なフォームを表示するためのHTMLです。methodにgetを指定するとURLの後ろに?マークが付き、それ以降にinputの数に応じて引数が続くようになります。postだと、URLには出てきませんがinputの内容を送信できるようになります。URLは長さ制限があるのでpostを使うのが普通です。<input type="text" name="test"> <input type="submit" /> </form>
<?php
PHPでPOSTで送られてきたデータは$_POSTに入っています。$_POSTはスーパーグローバル変数というどこからでも使える変数です。print_r($_POST); ?> <form action="" method="post"> <input type="text" name="test"> <input type="submit" /> </form>
上記のようにaction=""と空にすると同じファイルにアクセスすることになり、フォームに入力した文字列がprint_rで出力されるわけです。<input type="text" name="test2">と増やしたりいろいろやってみてください。
ちなみにフォームでsubmitしたとき以外はprint_rの結果は空の配列。submitしたとき以外は表示しないようにしたければ、
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
を使います。ブラウザでF5を押すなどしてリロードするとPOSTの内容が再送されます。再送したくないときはアドレス欄にフォーカスを当ててEnterを押せばOK。
memovie.orgでは app/views/index.php にフォームが記述してあります。
http://memovie/ にアクセスしたときにapp/controllers/Index.phpから呼び出されています。
このフレームワークでは lib/Request.phpの59行目で$this->params['post']に代入して、$this->paramsをcontrollersのexecute()に引数で与えてあります。$_POSTを直接使ってもよいですが、処理を一元化するために使っています。
app/views/index.php のフォームでactionを/post に指定したので app/controllers/Post.phpが呼ばれます。executeにprint_rがあると思いますが、ここで出力しているのが先ほどの$this->params。
データの流れはこのような感じです。
次回は取得したPOSTのデータをデータベースにINSERTする部分を。
|


とても勉強になっています、ありがとうございます。
勝手に勉強させてもらっている身で質問するのは大変恐縮なのですが、一つ質問させてもらえないでしょうか。
>http://memovie/
>にアクセスするとpublic/index.phpが呼び出されます。
私の環境では上記のアクセスではpublic/index.phpが呼び出されず、memovie/publicまでアクセスしないと、index.phpが呼び出されないのですが、何かapatchのhttpd.confで設定しなければいけないのでしょうか。
もしするならば、何を設定するのか教えていただけないでしょうか。
2008/3/18(火) 午後 9:56 [ toshio ]
役に立って何よりです。
DocumentRootの設定が影響していると思われます。
いかがでしょうか。
2008/3/19(水) 午前 9:20 [ funaki ]