檢視
檢視是什么?
檢視是呈现資料到瀏覽器的档案。这些档案可以让你的应用程序分離邏輯和呈现。檢視通常是 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 类別,以了解檢視的函式敘述。