檢視 - 一般
检视是什幺?
检视是呈现资料到浏览器的档案。这些档案可以让你的应用程序分离逻辑和呈现。检视通常是 html、javascript、或 css 但可以包含从控制器传入的变数。
建立检视
在 FuelPHP 中,检视被放在 APPPATH/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>
使用检视
在 Fuel 框架中检视是非常灵活的。你可以建立单一检视以及在其他检视内的巢状检视。这可用很多方式达成。
检视範例(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
{
public function action_index()
{
$data = array(); // 储存要给检视的变数
$data['username'] = 'Joe14';
$data['title'] = 'Home';
// 指派检视到浏览器输出
return View::forge('home/index', $data);
}
}
方法 2(使用上面的检视範例):
class Controller_Home extends Controller
{
public function action_index()
{
// 建立检视
$view = View::forge('home/index');
// 指派变数给检视
$view->username = 'Joe14';
$view->title = 'Home';
// 另一种指派变数给检视的方法
$view->set('username', 'Joe14');
$view->set('title', 'Home');
// 指派检视到浏览器输出
return $view;
}
}
安全性
检视使用编码输出来消毒你传给它们的任何事物。在预设安装中,安全方法 Security::htmlentities() 被定义为输出过滤器。你可以修改在你应用程序的 config.php 档案中的过滤器。 如果你想要传递一些不被过滤的东西,你可以使用 set($name, $value, false) 方法。
class Controller_Example extends Controller
{
public function action_index()
{
$view = \View::forge('example');
// 添加过滤,输出:<strong>not bold because filtered</strong>
$view->title = '<strong>not bold because filtered</strong>';
// 添加未经过滤的,输出:<strong> bold because unfiltered</strong>
$view->set('title', '<strong> bold because unfiltered</strong>', false);
// 或使用 set_safe() 方法,它与 set() 一致但预设为 'false'
$view->set_safe('title', '<strong> bold because unfiltered</strong>');
return $view;
}
}
如果你不希望你的检视这样运作,你可以传递 false 做为 View::forge() 的第三参数, 现在添加到此检视物件的所有事物将不被过滤。如果你之后需要过滤一些值,你可以使用 set($name, $value, true)。
你也可以透过设定应用程序配置值 security.auto_filter_output 为 false 来全域地停用过滤输出。为了安全起见, 强烈建议你别这幺做!
注意物件: 除非传递的物件是检视、表现控件或闭包(closure)类型, 当过滤输出被启用时,它被预期有一个 __toString() 方法并强制是一个字串。 如果你无论如何都希望传递它,你需要使用 set($name, $value, false), 但别忘了过滤你所使用的东西!
检视&表现控件被预期包含 HTML 并打理它们自己的过滤,这就是为什幺它们不消毒。 闭包(closure)不能被消毒,而且你应该小心确保在它们内部完成, 如果必要的话。
延迟呈现(Lazy rendering)
当实例化一个检视物件时,只有需要产生输出的环境被设置。 检视文件没有被读取,没有变数会被解译,也没有输出会被呈现。
这只有发生在你明确地在检视物件呼叫 render()
方法, 或当你转换检视物件为字串(自动发生在你写出它时)。这意味着非到绝对必要, 没有检视会进行处理。这也意味着 Fuel 不在记忆体中保留呈现的检视, 直到把它们发送到浏览器的时候。
巢状检视
检视也可以被巢状包含在其他检视。这可用很多方式达成。
检视範例
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
<h1><?php echo $title; ?></h1>
<div class="welcome_user">Welcome <?php echo $username; ?></div>
fuel/app/views/footer.php
<div class="footer">
© Copyright <?php echo date('Y');?> <?php echo $site_title; ?>
</div>
方法 1(使用以上的检视範例并且延迟呈现):
class Controller_Home extends Controller
{
public function action_index()
{
// 建立 layout 检视
$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');
// 回传检视物件到 Request
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 到 Request
return View::forge('layout', $views)->render();
}
}
方法 3(使用以上的检视範例,无全域资料,延迟呈现):
class Controller_Home extends Controller
{
public function action_index()
{
// 建立 layout 检视
$view = View::forge('layout');
// 本地检视变数,强制呈现
$view->head = View::forge('head', array('title' => 'Home'));
$view->header = View::forge('header', array('site_title' => 'My Website'));
$view->content = View::forge('content', array('username' => 'Joe14', 'title' => 'Home'));
$view->footer = View::forge('footer', array('site_title' => 'My Website'));
// 回传检视物件到 Request
return $view;
}
}
详见在类别章节中的 View 类别,以了解检视的函式叙述。