当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

檢視 - 一般

优质
小牛编辑
129浏览
2023-12-01

检视是什幺?

检视是呈现资料到浏览器的档案。这些档案可以让你的应用程序分离逻辑和呈现。检视通常是 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 类别,以了解检视的函式叙述。