ビュー
ビューとは?
ビューは、ブラウザにデータを提供するファイルです。アプリケーションのロジックとプレゼンテーションを分離することができます。ビューは典型的には html、javascript あるいは css ですが、コントローラからから渡される変数を含むことがあります。
ビューを作成する
FuelPHP では、 ビューは fuel/app/views ディレクトリに置きます。サブディレクトリに置くこともできます。fuel/app/views からのディレクトリパスとファイル名から命名します。従って、fuel/app/views/user/join.php にあるビューファイルは user/join と命名されます。
例:
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
Welcome, <?php echo $username; ?>.
</body>
</html>
ビューを使用する
FuelPHP フレームワークのビューは柔軟です。単一ビューを作成し、ビューを他のビューの中に入れ子にすることができます。複数の方法で可能です。
ビューの例 (fuel/app/views/home/index.php):
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
Welcome, <?php echo $username; ?>.
</body>
</html>
方法 1 (上記ビューを使用):
class Controller_Home extends Controller
{
$data = array(); //ビューに渡す変数を格納する
$data['username'] = 'Joe14';
$data['title'] = 'Home';
//ビューをブラウザ出力に割り当てる
return View::forge('home/index', $data);
}
方法 2 (上記ビューを使用):
class Controller_Home extends Controller
{
//ビューを作成する
$view = View::forge('home/index');
//ビューに変数を割り当てる
$view->username = 'Joe14';
$view->title = 'Home';
//ビューに変数を割り当てる別の方法
$view->set('username', 'Joe14');
$view->set('title', 'Home');
//ビューをブラウザ出力に割り当てる
return $view;
}
セキュリティ
Views use output encoding to sanitize anything you pass to them. In a default installation, the security method Security::htmlentities() is defined as output filter. You can modify the filters in your applications config.php file. If you want to pass something unfiltered, you can use the method set($name, $value, false).
class Controller_Example extends Controller
{
public function action_index()
{
$view = \View::forge('example');
// add it unfiltered just like you added
// フィルタされて出力される: <strong>not bold because filtered</strong>
$view->title = '<strong>not bold because filtered</strong>';
// フィルタしないで追加する
$view->set('title', '<strong>not bold because filtered</strong>', false);
// or use the set_safe() method, which is identical to set() but defaults to 'false'
$view->set_safe('title', '<strong> bold because unfiltered</strong>');
return $view;
}
}
If you don't want your View to work like this, you can pass false as third argument View::forge()
Now anything added to this View object will be unfiltered. If you then do want some values filtered, you can use
set($name, $value, true).
You can also globally disable the output filter by setting the application
configuration value security.auto_filter_output to false. For security reasons it is highly recommended
that you don't do this!
オブジェクトについての注意: 渡されるオブジェクトが View、ViewModel あるいは Closure のインスタンスでない限り、
オブジェクトは __toString() メソッドを持つことが期待され、出力フィルタリングが有効なとき文字列に強制変換されます。どうしても渡したい場合は、
set($name, $value, false) を使用する必要がありますが、 フィルタすることを決して忘れないで
ください。
View と ViewModels は HTML を含み、サニタイズされないものを独自にフィルタリングすることが期待されます。
Closures はサニタイズできませんので、必要ならば内部でサニタイズが確実に行われるように
注意すべきです。
遅延レンダリング
ビューオブジェクトを初期化するとき、出力を生成するのに必要な環境のみがセットアップされます。ビューファイルは読み込まれず、 変数は解釈されず、出力はレンダリングされません。
これは render()
メソッドを明示的に呼び出す場合、あるいは
ビューオブジェクトを文字列にキャストする(echo すると自動的にそうなります)ときのみ起きます。つまり、ビューは完全に必要になるまで処理されません。
FuelPHP はブラウザに出力する時が来るまで、レンダリングしたビューをメモリに保存しない、
ということでもあります。
ビューを入れ子にする
ビューは入れ子にすることができます。複数の方法が可能です。
ビューの例
fuel/app/views/layout.php
<html>
<head>
<?php echo $head; ?>
</head>
<body>
<?php echo $header; ?>
<?php echo $content; ?>
<?php echo $footer; ?>
</body>
</html>
fuel/app/views/head.php
<title><?php echo $title; ?></title>
fuel/app/views/header.php
<div class="logo"></div>
<div class="logo_text"><?php echo $site_title; ?></div>
fuel/app/views/content.php
<title><?php echo $title; ?></title>
<div class="welcome_user">Welcome <?php echo $username; ?></div>
fuel/app/views/footer.php
<div class="footer">
© Copyright <?php echo date(x27;Yx27;);?> <?php echo $site_title; ?>
</div>
方法 1 (上記の例と遅延レンダリングを使用):
class Controller_Home extends Controller
{
public function action_index()
{
// ビューを作成する
$view = View::forge('layout');
// グローバル変数(すべてのビューがアクセスできる)を割り当てる
$view->set_global('username', 'Joe14');
$view->set_global('title', 'Home');
$view->set_global('site_title', 'My Website');
//変数としてビューを割り当てる、遅延レンダリング
$view->head = View::forge('head');
$view->header = View::forge('header');
$view->content = View::forge('content');
$view->footer = View::forge('footer');
// ビューオブジェクトをリクエストに返す
return $view;
}
}
方法 2 (上記の例と強制レンダリングを使用):
class Controller_Home extends Controller
{
public function action_index()
{
//変数を割り当てる
$data = array();
$data['title'] = 'Home';
$data['site_title'] = 'My Website';
$data['username'] = 'Joe14';
//変数としてビューを割り当てる、強制レンダリング
$views = array();
$views['head'] = View::forge('head', $data)->render();
$views['header'] = View::forge('header', $data)->render();
$views['content'] = View::forge('content', $data)->render();
$views['footer'] = View::forge('footer', $data)->render();
// レンダリングした HTML をリクエストに返す
return View::forge('layout', $views)->render();
}
}
ビューの機能の説明は、View Class in the classes section を参照ください。