(゚д゚)ノ こむばむわ、中の人ですぉ。
さて引き続き本日もコードイグナイダーっていきましょう(意味不明
今回は宣言どおり、コントローラーとビューについてやっていきまっしょい。(゚д゚)クワッ
前にMVCとか出てきたと思うけれど要は動きの部分と見た目の部分ですな。残りはDBなので今回はパス。次回以降で。
では早速やっていきませう。
まずは前回の事項の確認。
コードイグナイターアクセス時には、http://localhost/codeigniterapp/ コントローラー/メソッド
でアクセスすると書きましたが、そこのあたりを具体的に見ていって見ませう。
まずは例用にheloクラスを作成。
クラス名:Helo
ファイル名:helo.php
※クラス名は最初の一文字のみ必ず大文字に。ファイル名はすべて小文字で。
『application』内の『contllers』フォルダ内に『helo.php』を作成しませう。
helo.php
<?php
class Helo extends Controller {
function Helo(){
parent::Controller();
}
function index(){
echo 'これはCodeigniterの表示です。';
}
}
?>
保存できたら、アドレス欄にhttp://localhost/codeigniterapp/helo
でアクセスしてみませう。
↑の様に表示されたら成功。
もし文字化けしたら文字コードをUTF8なりに変えてください。
この画面は、『helo.php』のHeloクラスのindexメソッドを実行した結果です。
メソッドも指定されていない場合にはweb鯖のindex.html同様indexのモノを実行します。
web鯖ではファイル名が指定されていない場合、index.htmlにアクセスしているものとみなされますがそれと一緒です。
上記のアドレスを正しく表記するなら、以下のようになります。
http://localhost/codeigniterapp/index.php/helo/index
↑の様に、index.phpにheloというコントローラー名とindexというメソッドが渡されていることになります。
ではコードの解説に移りましょう。
<?php
class クラス名 extends Controller {
function クラス名(){
parent::Controller();
}
function index(){
echo 'これはCodeigniterの表示です。';
}
}
?>
クラスは必ずControolerクラスを継承して作成します。
クラス名は何でもおkですが、必ずファイル名と同じにしませう。
そして最初の文字のみ大文字にしませう。(ファイル名はすべて小文字、クラス名は最初の一文字のみ大文字)
つぎはCodeigniter固有のお話。
コードイグナイターでは、クラス名と同じ名称のメソッドがコンストラクタとして機能します。つまり__constructとわざわざ書く必要はないわけです。
そしてその中では必ずparent::Controoler();を実行しておきます。
これによりスーパークラスであるControolerクラスのコンストラクタが呼び出され、初期化処理がスーパークラスに渡されます。
コントローラーには、アクセスして実行されるメソッドが用意されます。
これは引数をもたないシンプルなもの。
今回はechoで文字列を書き出すだけの処理です。
つまりブラウザに文字列が表示されるだけになります。
以上がざっとコードの解説になるわけですが、今のままだと、コントローラーで表示までしちゃっているわけですよ。
MVCの意味がないので表示部分をV(View)に分けてみませう。
まずはViewのファイルを作成します。
『aplication』内の『views』フォルダの中にview用のファイルを作成します。
ぶっちゃけXAMPPだと初期段階で直アク防止用indexファイル(403ファイル)があるので、めんどいのでこれを直接書き換えてつつ別名で保存してしまいましょう(ぉぃ
デフォルトindex.html
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>
これを下記の様に書き換えて、『別名で保存』、『index.php』というファイル名で『views』フォルダに保存しましょう。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3c.org./TR/xhtml1/DTD/xhtml1-transitional.dtd
">
<html xmlns="http://www.w3.org/1999/xhtml
">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Helo</title>
</head>
<body>
<h1>HELO!</h1>
<p>これはビューを使った表示です。</p>
</body>
</html>
ちなみに文字コードはUTF-8で保存しましょう。でないと文字化けしますよ。
続いて、Vを分けたのでコントローラーにも修正が必要です。
Heloコントローラークラスのindexメソッドを修正しましょー。
といっても書き換えるのはホントにこれだけなんですがね。
function index(){
$this->load->view('index');
}
↑インデックスメソッド以外はそのままで。{とか誤って消さない様に注意。
で。
できたらブラウザでhttp://localhost/codeigniterapp/helo にアクセス!
↑の様に表示されましたでしょうか?もし『これがCodeigniterの表示です』が表示された場合はもう一度『views』フォルダのindex.phpファイルと、『controller』フォルダのhelo.phpファイルのコードを確認してください。
ヽ( ^ω^)ノ サクセス!
では解説。
$this->load->view('index');
すでに予想されているとは思いますが、↑の一行の意味は「views」フォルダ内から、indexという名称(拡張子切捨)のファイルをロードして表示!という命令。要は拡張子を除いたファイル名を読み込んでレンダリングして表示するというコト。
さて。以上で一応MVCのVとCの切り分けができるようになったわけだ。
だがぢつはまだ問題は残されている。
それは…
ヽ( ^ω^)ノ サクセス!
じゃない、どうやって変数等の値を受け渡すか、という部分だ。
というわけで後半はフォームの作成を通じて変数の受け渡しを実践していくぉ!
とまぁそういうことで後半戦へいきまっしょい。
さぁ、コントローラーからビューへ値を受け渡して表示させるにはどうすればいいか。
一般的なフレームワークでは、必要な値をコントローラーで設定することでビューにその値を埋め込むことができる。その点はcodeigniterも同様なのだが、他と違うのはそれが変数ではなく、連想配列の形で渡されることだろう。
管理人がうろ覚えで思い出すと、たしかスマーティー等では、htmlに{$title}だか何だかというモノを埋め込むことでPHP側で定義した変数$titleがあたかもHTMLへ埋め込まれているように表示される、というものだ。
つまるところ、{$title}は$titleなのであり、一対一の関係。それに対してコードイグナイターでは勝手に連想配列が生成されてその連想配列を指定することで変数の値が取れる、という仕組みを採用しているようだ。
仕組みは、viewをロード、レンダリングする際にその連想配列を渡すとview側でその連想配列に入っている各キーに対応した名前の変数が用意されるというものだ。
まぁ、説明するより実際にやってみたほうがはやいので、そうしてみよう。
まずはコントローラーのindexメソッドを修正しよう。ファイル名はもち『helo.php』。
修正する箇所は下記の部分。ほかはいじっちゃダメ!!
function index(){
$this->load->view('index');
}
を、下のように修正。
function index(){
$data = array(
'title' => 'INDEX PAGE',
'h1' => 'HEADLINE',
'p' => array(
'これはCodeigniterによるWEBページです。',
'複数の値を変数としてビューに受け渡せます。',
'実際に試してみてください'
)
);
$this->load->view('index',$data);
}
続いてビューの方も修正。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3c.org./TR/xhtml1/DTD/xhtml1-transitional.dtd
">
<html xmlns="http://www.w3.org/1999/xhtml
">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?=$title ?></title>
</head>
<body>
<h1><?=$h1 ?></h1>
<?php foreach($p as $p1): ?>
<p><?=$p1 ?></p>
<?php endforeach; ?>
</body>
</html>
<title>、<h1>、<p>にそれぞれ変数を出力するための記述が埋め込まれています。
<?=h1 ?>はスマーティーでいうところの{$h1}みたいなモノ。
で。注意点は<p.>の部分。
↑で$p1に対してはさらに配列で
'これはCodeigniterによるWEBページです。',
'複数の値を変数としてビューに受け渡せます。',
'実際に試してみてください'
の3つの値が渡されています。
titleやh1では単一なことを考えるとこれは面倒です。ですが、foreachのタグを埋め込むことでp1配列内のすべてを表示できる、という形になります。
※エラー!!index.php*行目が***※と表示された場合は
⇒foreachに注意!(管理人はこれではまったorz)<?php foreach($p as $p1): ?>の部分。
foreachの開きタグ()の後ろは『;』ではなく、『:』です。これ間違えるとエラー。しばらく原因がわからずに云々うなっておりますた。||orz ちなみに閉じの<?php endforeach; ?>では『;』でおk。
しかしこれで配列までも自由に埋め込めるようになったわけですね。…ゴクリ。
(´・ω・`)いい加減長くなってきた&日付変わったのでフォームは以下次号!!
つづきます…orz



