视图布局
CodeIgniter 支持一个简单但非常灵活的布局系统,它使在整个应用程序中使用一个或多个基本页面布局变得简单。布局支持可以从任何正在渲染的视图中插入的内容部分。您可以创建不同的布局来支持单列、双列、博客存档页面等。布局永远不会直接渲染。相反,您渲染一个视图,该视图指定它想要扩展的布局。
创建布局
布局与其他视图类似,唯一的区别在于它们的预期用途。布局是唯一使用 renderSection()
方法的视图文件。此方法充当内容的占位符。
例如:app/Views/default.php
<!doctype html>
<html>
<head>
<title>My Layout</title>
</head>
<body>
<?= $this->renderSection('content') ?>
</body>
</html>
renderSection()
方法有两个参数:$sectionName
和 $saveData
。 $sectionName
是任何子视图用来命名内容部分的节名称。如果布尔参数 $saveData
设置为 true,则该方法会保存数据以供后续调用。否则,该方法会在显示内容后清除数据。
例如:app/Views/welcome_message.php
<!doctype html>
<html>
<head>
<title><?= $this->renderSection('page_title', true) ?></title>
</head>
<body>
<h1><?= $this->renderSection('page_title') ?><h1>
<p><?= $this->renderSection('content') ?></p>
</body>
</html>
注意
$saveData
可从 v4.4.0 开始使用。
在视图中使用布局
每当视图想要插入布局时,它必须在文件顶部使用 extend()
方法
<?= $this->extend('default') ?>
extend()
方法接受您想要使用的任何视图文件的名称。由于它们是标准视图,因此它们的位置与视图相同。默认情况下,它将在应用程序的 View 目录中查找,但也会扫描其他 PSR-4 定义的命名空间。您可以包含一个命名空间来定位特定命名空间 View 目录中的视图
<?= $this->extend('Blog\Views\default') ?>
扩展布局的视图中的所有内容都必须包含在 section($name)
和 endSection()
方法调用中。这些调用之间的任何内容都将插入到布局中,无论匹配节名称的 renderSection($name)
调用位于何处。
例如:app/Views/some_view.php
<?= $this->extend('default') ?>
<?= $this->section('content') ?>
<h1>Hello World!</h1>
<?= $this->endSection() ?>
endSection()
不需要节名称。它会自动知道要关闭哪个节。
节可以包含嵌套节
<?= $this->extend('default') ?>
<?= $this->section('content') ?>
<h1>Hello World!</h1>
<?= $this->section('javascript') ?>
let a = 'a';
<?= $this->endSection() ?>
<?= $this->endSection() ?>
渲染视图
渲染视图及其布局与在控制器中显示任何其他视图的方式完全相同
<?php
namespace App\Controllers;
class MyController extends BaseController
{
public function index()
{
return view('some_view');
}
}
它渲染 View app/Views/some_view.php,如果它扩展了 default
,则 Layout app/Views/default.php 也会自动使用。渲染器足够智能,可以检测视图是否应该单独渲染,或者是否需要布局。
包含视图部分
视图片段是不会扩展任何布局的视图文件。它们通常包含可以在不同视图之间重复使用的内容。使用视图布局时,必须使用 $this->include()
来包含任何视图片段。
<?= $this->extend('default') ?>
<?= $this->section('content') ?>
<h1>Hello World!</h1>
<?= $this->include('sidebar') ?>
<?= $this->endSection() ?>
调用 include()
方法时,可以传递与渲染普通视图时相同的选项,包括缓存指令等。