チュートリアル Templateコントローラ
次 チュートリアル RestコントローラとHybridコントローラ
おはようございます。ゆうきんのようなものです。
前回、HelloWorldを作って基本的なページの作り方を覚えました。
しかし、まだまだ安心してはいけません。ここからが本当の地獄だ・・・。
今回はTemplateコントローラについて説明します。
Webサイトって左に表示されるメニューとか、上部に表示されてるタイトルとか、ページを遷移しても変わらないページがありますよね?
その変わらない部分と変わる部分を切り離し、ビューとして作成し管理するのがTemplateコントローラです。
他の使い方もありますが、私は主にこの方法で使用します。
違う使い方でも覚えることは一緒なので安心して下さい。
まずはTemplateコントローラの規約をまとめます。
Templateコントローラの規約
- Controller_Templateクラスを継承する
- デフォルトレイアウトファイル(テンプレートファイル)は fuel/app/views/template.php である
- $this->template にテンプレートファイルのビューオブジェクトが自動的に代入される
- アクションメソッドでは自動的にビューオブジェクトが返される
- デフォルトテンプレートを使いたくなければ $this->template に違うビューを入れれば良い
- beforeメソッドを使う場合は必ずparent::before() を呼び出す
以上です。新しい単語とかいろいろ出てきてなんのこっちゃと思うでしょうが、きちんと説明します。
デフォルトレイアウトファイル(テンプレートファイル)とは、表示したいビューをはめ込んでいくビューです。
なんか意味わかんないですね。多分見たほうが早いです。というわけでほい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title><?php echo $title ?></title> </head> <body> <div id="header"> <?php echo $header ?> </div> <div id="content"> <?php echo $content ?> </div> <div id="footer"> <?php echo $footer ?> </div> </body> </html> |
これがテンプレートファイルです。これは簡単なものです。もちろん作りたいページによって変化します。
あ、でも簡単なものでも難しいものでも、規約通り template.php という名前で fuel/app/views に配置してくださいね。
そこに配置したものがデフォルトレイアウトファイルとして認識されますから。
そして、テンプレートコントローラの $title, $header, $content, $footer にコントローラで生成したビューオブジェクトや、文字列をはめ込んで、表示したいページを作っていくわけです。
というわけでTemplateコントローラのサンプルも載せます。
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 |
<?php /** * サンプルクラス */ class Controller_Sample extends Controller_Template { /** * アクションメソッドを実行する前に処理される */ public function before() { // 必ず親クラスのbefore()メソッドを実行する parent::before(); // header と footer を指定 $this->template->header = View::forge('header'); $this->template->footer = View::forge('footer'); } /** * 挨拶1 */ public function action_hello1() { // ビューファイル全体に$titleをセットする $this->template->set_global('title', '挨拶1'); // コンテンツを生成しはめ込む $this->template->content = View::forge('hellos/hello1'); } /** * 挨拶2 */ public function action_hello2() { // ビューファイル全体に$titleをセットする $this->template->set_global('title', '挨拶2'); // コンテンツを生成しはめ込む $this->template->content = View::forge('hellos/hello2'); } } |
このファイルはコントローラなので、fuel/classes/controller に配置します。
$this->template とはさっき作ったテンプレートファイルのビューオブジェクトです。
指定も生成もしてないじゃんと思うかもしれませんが、規約でも少し触れたように、デフォルトレイアウトファイルは自動で読み込まれるので、特に意識しなくても大丈夫です。
むしろきちんとデフォルトレイアウトファイルを用意しないと面倒くさいので、きちんと用意するのをオススメします。
注意事項ですが、規約にもあるとおり、Templateコントローラで beforeメソッドを使用する場合、必ず parent::before() を呼び出して下さい。でないと、エラーが出ます。
お気づきでしょうが、$this->template->header がテンプレートファイルで用意した $header です。
$this->template->header = View::forge(‘header’) というようにテンプレートファイルに生成したビューオブジェクトをはめ込んでいきます。
余談ですがビューに渡す変数がなければ、第2引数は省略可能です。
そして、 $title に値をセットして、 content にビューオブジェクトをはめ込んでいます。
規約にも書きましたが、Templateコントローラのアクションメソッドでは自動的にビューオブジェクト、つまり $this->template が返されるので、明示的に書く必要がありません。
$title に値をセットするとき set_global というメソッドを使っていますが、またの機会に詳しく書きます。
簡単に説明すると、 set_global で値をセットすると全てのビューオブジェクトで使用可能になる、というものです。
生成するビューのサンプルも載せておきます。
1 2 3 |
<div> <p>挨拶をしよう</p> </div> |
1 2 3 |
<div> <p>挨拶終わり</p> </div> |
1 2 3 |
<div> <p>おはようございます</p> </div> |
1 2 3 |
<div> <p>おやすみなさい</p> </div> |
決して手抜きではありません。・・・決して手抜きではありません。大事な事なので2回言いました。
hello1 と hello2 は fuel/app/views に hellos というフォルダを作って配置してありますので、ご注意を。
全てのファイルが用意できたら、 http://fuelphp/sample/hello1 と http://fuelphp/sample/hello2 にアクセスしてみて下さい。
最初と最後の文章は変わらずに、中央の挨拶だけが変わる手抜きのページが見れると思います。
以上が、Templateコントローラの概要と作り方です。
かなり、簡単なページで説明しましたが、使いこなすととんでもなく作業量を減らすことが出来る大変便利なものです。
近代的なページのようなレイアウトにしたければ javascript と css を多用することになるのはFuelPHPでも一緒ですが、私は一切説明するつもりはありません!
では、おやすみなさい。