はじめてのKohana (5) : ビュー
この記事は賞味期限切れです。(更新から1年が経過しています)
「はじめてのKohana」の第五回目です。 今回は、Kohanaのビューについて紹介します。
ビューファイル
Kohanaのビューファイルはこちらに格納する決まりになっています。
/application/views/
例えば、単純に文字列を表示するだけの「hello」というコントローラー・ビューを作ってみるとします。
/application/views/hello.php
これがhelloビューの格納場所になります。 内容は適当に。
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
Hello !!
</body>
</html>
では、このビューファイルをhelloコントローラーで出力してみます。
class Controller_Hello extends Controller {
public function action_index(){
$view = View::factory("hello"); // Viewクラスでインスタンスを生成
$this->response->body($view); // 生成したインスタンスをResponseで出力
}
}
View::factory( $name ) で名前に応じたビューファイルからインスタンスを作る事ができます。 ビューの出力は、基本的にこのインスタンスを使って制御する事になります。
この例では、”hello” という名前から /application/views/hello.php を元にしたビューのインスタンスを生成しています。
ビューに値を渡す(set)
実際の運用では、ビューファイルに値を渡して、それにより値を表示させたり切り替えたりすると思います。 ビューに値を渡すには、ビューインスタンスのsetメソッドを利用します。
$view = View::factory("hello");
$view->set("name", "John"); // set( $key, $value );
上記の形以外にも、連想配列で引数を渡したり、プロパティの追加でも値を設定する事ができます。
// 下の3つは全て同じ処理
$view->set("name", "John");
$view->set( aray("name" => "John") );
$view->name = "John";
setされた値は、ビューファイル側でキーの名前の変数にて参照できます。
Hello, <?php echo $name; ?> !!
値を参照渡しする(bind)
setは値渡しですが、bindメソッドを使えば参照渡しをする事も出来ます。
$foo = "bar";
$view = View::factory("hello");
$view->bind("foo", $foo);
$this->response->body($view);
$foo = "piyo";
(ビューファイルでの結果)
echo $foo; // <= "piyo"
setを使った場合は、上の出力結果は”bar”になります。
共用の値を設定する
複数のビュー・アクションで共通の値を利用したい場合は、set_global または bind_global を使用します。 beforeメソッド等で値を設定しておけば、そのコントローラー内の全てのアクションのビューでその値を参照できます。
set_global と bind_global の違いは set / bind と同様に、値渡しをするか、参照渡しをするかの違いです。
public function before(){
View::set_global("title", "HELLO PAGE");
}
public function action_index(){
$view = View::factory("hello");
$this->response->body($view);
}
(ビューファイルでの結果)
echo $title; // <= "HELLO PAGE"
ビューの中のビュー
ウィジェット等の出力でよく使われると思いますが、 ビューの中にビューを展開する為の方法として、公式のドキュメントでは幾つかのアプローチが提案されています。 状況と目的に応じて使い分けるとよいでしょう。
ビューの中でインスタンスを生成する
基本的にそのインスタンスでset/bindした値しか使えません。
<?php
echo View::factory("widget")->bind("foo", $foo);
?>
ビューの中でincludeする
より原始的な方法です。 特徴としては、親のビューのコンテキストで展開されるので、 親のビューで使用できる全ての値が子のビューでも使用できます。
<?php
include Kohana::find_file("views", "widget");
?>
コントローラ内で、子のビューを親のビューにアサインする
親となるビューに、子のビューのインスタンスを生成して渡します。 コントローラで表示を操れるのが特徴です。
$view = View::factory("layout");
$view->widget = View::factory("widget")->set("foo", $foo);
$this->response->body($view);
まとめ
Kohanaのビューについてご紹介しました。 次回は、アプリの核となるデータベースとモデルの話をします。
» もくじ
コメント