檢視

檢視是什么?

檢視是呈现資料到瀏覽器的档案。这些档案可以让你的应用程序分離邏輯和呈现。檢視通常是 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');

		// 添加過濾,輸出:&lt;strong&gt;not bold because filtered&lt;/strong&gt;
		$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_outputfalse 來全域地停用過濾輸出。为了安全起見, 強烈建議你別这麼做!

注意物件: 除非傳遞的物件是檢視、表现控件或閉包(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">
	&copy; 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 类別,以了解檢視的函式敘述。