Template コントローラ

Template コントローラとは?

Template コントローラは、ベースとなるコントローラの拡張で、いくつかの定義済みの before() と after() メソッドを使用することで、テンプレート機能を持っています。 基本的に、 ヘッダ、フッタ、サイドバーなどを持つレイアウトで、ビューをラップします。

Template コントローラの使用

すべてのコントローラと同じように、 fuel/app/classes/controller ディレクトリにクラスを作成します。 Controller_Template クラスを継承する必要があり、デフォルトでは "Controller_" を頭に付けます。以下はコントローラ "example" の例です:

注意: デフォルトでは、Controller_Template を拡張したクラスのすべてのメソッドは、テンプレートを使用します。
しかし、テンプレートから メソッドを省略することも 可能です。

class Controller_Example extends Controller_Template
{
	public function action_index()
	{
		$data = array();
		$this->template->title = 'Example Page';
		$this->template->content = View::forge('test/index', $data);
	}
}

Template コントローラでの before() の使用

注意: Template コントローラで before() メソッドを使う場合、 parent::before(); を追加 しなければなりません。 そうしないと $this->template が 使えません。 Controller_Template の after() メソッドとの互換性を維持してください: 単なる after() ではなく、after($response) を使ってください。

class Controller_Example extends Controller_Template
{
	/**
	 * あなたの before メソッド
	 */
	public function before()
	{
		parent::before(); // この行がないと、テンプレートが動作しません!

		// 何かする
	}

	/**
	 * $response をパラメータとして追加し、after() を Controller_Template 互換にする
	 */
	public function after($response)
	{
		$response = parent::after($response); // あなた自身のレスポンスオブジェクトを作成する場合は必要ありません。

		// do stuff

		return $response; // after() は確実に Response オブジェクトを返すように
	}

	public function action_index()
	{
		$data = array();
		$this->template->title = 'Example Page';
		$this->template->content = View::forge('test/index', $data);
	}
}

テンプレートの例

テンプレートファイルは、JS、CSS などを呼び出し、HTML を構造化し、ビューの部品を呼び出すのに絶好の場所です。また、出力の骨組みを提供します。 それはただのビューファイルで、Template コントローラはデフォルトでは次のファイルを探します: fuel/app/views/template.php

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title><?php echo $title; ?></title>

	<?php echo Asset::css('main.css'); ?>
</head>
<body>
	<div id="wrapper">
		<h1><?php echo $title; ?></h1>

		<div id="content">
			<?php echo $content; ?>
		</div>
	</div>
</body>
</html>

デフォルトのテンプレートファイルの変更

デフォルトの APPPATH/views/template.php ファイルは簡単に変更できます。
public な変数 $template (注意: 拡張子 .php は必要ありません) を別のものに設定します。例えば:

class Controller_Example extends Controller_Template
{

	public $template = 'template_admin';

	public function action_index()
	{
		$this->template->title = 'Example Page';
		$this->template->content = View::forge('test/index', $data);
	}
}

Template コントローラからメソッドを省略する

デフォルトでは、Controller_Template を拡張したクラスのすべてのメソッドは、テンプレートを使用します。
もし、テンプレートを使用したくない場合は、何か別の内容を含む Response オブジェクトを返します。 それが、デフォルトのテンプレートの出力を上書きします。

class Controller_Example extends Controller_Template
{
	public $template = 'template_admin';

	public function action_index()
	{
		$this->template->title   = 'Example Page';
		$this->template->content = View::forge('test/index', $data);

		// テンプレートのコンテンツを表示する
	}

	public function action_Example()
	{
		$data['title']   = "Example Page";
		$data['content'] = "Don't show me in the template";

		// Response オブジェクトが返されると、それが優先され、テンプレートなしのコンテンツが表示される
		return new Response(View::forge('index/test', $data));
	}
}