- Yii 教程
- Yii - 首页
- Yii - 概述
- Yii - 安装
- Yii - 创建页面
- Yii - 应用结构
- Yii - 入口脚本
- Yii - 控制器
- Yii - 使用控制器
- Yii - 使用动作
- Yii - 模型
- Yii - 小部件
- Yii - 模块
- Yii - 视图
- Yii - 布局
- Yii - 资源
- Yii - 资源转换
- Yii - 扩展
- Yii - 创建扩展
- Yii - HTTP 请求
- Yii - 响应
- Yii - URL 格式
- Yii - URL 路由
- Yii - URL 规则
- Yii - HTML 表单
- Yii - 验证
- Yii - 特设验证
- Yii - AJAX 验证
- Yii - 会话
- Yii - 使用闪存数据
- Yii - Cookie
- Yii - 使用 Cookie
- Yii - 文件上传
- Yii - 格式化
- Yii - 分页
- Yii - 排序
- Yii - 属性
- Yii - 数据提供者
- Yii - 数据小部件
- Yii - ListView 小部件
- Yii - GridView 小部件
- Yii - 事件
- Yii - 创建事件
- Yii - 行为
- Yii - 创建行为
- Yii - 配置
- Yii - 依赖注入
- Yii - 数据库访问
- Yii - 数据访问对象
- Yii - 查询构建器
- Yii - 活动记录
- Yii - 数据库迁移
- Yii - 主题
- Yii - RESTful API
- Yii - RESTful API 实战
- Yii - 字段
- Yii - 测试
- Yii - 缓存
- Yii - 碎片缓存
- Yii - 别名
- Yii - 日志记录
- Yii - 错误处理
- Yii - 身份验证
- Yii - 授权
- Yii - 本地化
- Yii - Gii
- Gii – 创建模型
- Gii – 生成控制器
- Gii – 生成模块
- Yii 有用资源
- Yii - 快速指南
- Yii - 有用资源
- Yii - 讨论
Yii - 布局
布局表示多个视图的公共部分,例如页面页眉和页脚。默认情况下,布局应存储在views/layouts文件夹中。
让我们看看基本应用程序模板的主布局:
<?php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>">
<meta name = "viewport" content = "width = device-width, initial-scale = 1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class = "wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
Yii::$app->user->isGuest ?
['label' => 'Login', 'url' => ['/site/login']] :
[
'label' => 'Logout (' . Yii::$app->user->identity->username.')',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post']
],
],
]);
NavBar::end();
?>
<div class = "container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this>params
['breadcrumbs'] : [],
]) ?>
<?= $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
此布局生成所有页面通用的 HTML 页面。$content变量是内容视图的渲染结果。以下方法会触发有关渲染过程的事件,以便可以正确注入其他地方注册的脚本和标签:
head() - 应在head部分中调用。生成一个占位符,该占位符将被针对头部位置注册的 HTML 替换。
beginBody() - 应在body部分的开头调用。触发EVENT_BEGIN_BODY事件。生成一个占位符,该占位符将被针对 body 开始位置注册的 HTML 替换。
endBody() - 应在body部分的结尾调用。触发EVENT_END_BODY事件。生成一个占位符,该占位符将被针对 body 结束位置注册的 HTML 替换。
beginPage() - 应在布局的开头调用。触发EVENT_BEGIN_PAGE事件。
endPage() - 应在布局的结尾调用。触发EVENT_END_PAGE事件。
创建布局
步骤 1 - 在 views/layouts 目录中,创建一个名为newlayout.php的文件,其中包含以下代码。
<?php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>">
<meta name = "viewport" content = "width = device-width, initial-scale = 1">
<? = Html::csrfMetaTags() ?>
<title><? = Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class = "wrap">
<div class = "container">
<? = $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><? = Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
我们去掉了顶部的菜单栏。
步骤 2 - 要将此布局应用于SiteController,请将$layout属性添加到SiteController类。
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public $layout = “newlayout”;
/* other methods */
}
?>
步骤 3 - 现在,如果您在 SiteController 的任何视图的网页浏览器中访问,您将看到布局已更改。
步骤 4 - 要注册各种元标记,您可以在内容视图中调用yii\web\View::registerMetaTag()。
步骤 5 - 修改SiteController的“关于”视图。
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the description
of this page!'], 'description');
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<code><?= __FILE__ ?></code>
</div>
我们刚刚注册了两个元标记 - keywords 和 description。
步骤 6 - 现在访问https://:8080/index.php?r=site/about,您将在页面的 head 部分找到元标记,如下面的屏幕截图所示。
视图触发多个事件:
EVENT_BEGIN_BODY - 通过调用yii\web\View::beginBody()在布局中触发。
EVENT_END_BODY - 通过调用yii\web\View::endBody()在布局中触发。
EVENT_BEGIN_PAGE - 通过调用yii\web\View::beginPage()在布局中触发。
EVENT_END_PAGE - 通过调用yii\web\View::endPage()在布局中触发。
EVENT_BEFORE_RENDER - 在控制器中,在渲染文件开始时触发。
EVENT_AFTER_RENDER - 渲染文件后触发。
您可以响应这些事件以将内容注入视图。
步骤 7 - 要在SiteController的actionAbout中显示当前日期和时间,请按此方式修改它。
public function actionAbout() {
\Yii::$app->view->on(View::EVENT_BEGIN_BODY, function () {
echo date('m.d.Y H:i:s');
});
return $this->render('about');
}
步骤 8 - 在网页浏览器的地址栏中键入https://:8080/index.php?r=site/about,您将看到以下内容。
重要提示
为了使视图更易于管理,您应该:
- 将复杂的视图分成几个较小的视图。
- 对常见的 HTML 部分(页眉、页脚、菜单等)使用布局。
- 使用小部件。
视图应:
- 包含 HTML 和简单的 PHP 代码以格式化和呈现数据。
- 不处理请求。
- 不修改模型属性。
- 不执行数据库查询。