> ## 模板布局
> 开启模板布局之后,渲染模板之前会先渲染布局模板layout
### 第一种方式:全局配置方式(适合全站采用同一布局)
```
// 1.首先应该在配置文件这样配置
'template' => [
'layout_on' => true, // 开启模板布局
,默认是false
'layout_name' => 'layout/layoutname', // 布局入口文件,默认是layout,布局文件在模块的view目录下
'layout_item' => '{__REPLACE__}', // 内容输出替换变量:默认是__CONTENT__
]
// 2.一个简单的layout.html实例(__CONTENT__是特定的模板输出替换变量,视图文件会替换到这个变量的位置)
{include file="public/header" /}
{__CONTENT__}
{include file="public/footer" /}
// 3.如果某些页面不需要使用布局模板功能,可以在模板文件开头加上 {__NOLAYOUT__} 字符串。
```
### 第二种方式:模板标签方式(不需要在配置文件进行修改和开启layout_on,layout_on必须为默认的关闭状态)
```
// 只需要在视图文件的开头加入下面标签,replace用来指定布局文件中用来代表该视图文件位置的变量
{layout name="Layout/newlayout" replace="[__REPLACE__]" /}
// 没有写layout标签即代表不使用模板布局
```
### 第三种方式:使用layout控制模板布局(也不需要在配置文件修改和开启layout_on)
```
class User extends Controller
{
public function add()
{
// 开启模板布局,并且采用默认的layout布局文件
$this->view->engine->layout(true);
// 动态指定布局文件的名称
$this->view->engine->layout('Layout/newlayout');
// 临时关闭布局模板
$this->view->engine->layout(false);
return $this->fetch('add');
}
}
```
> ## 模板继承{extend name="base" /}
> ### 1.基础模板有很多block区块标签,然后继承于这个模板的子模板根据基础模板的name属性分别替换这些区块
> ### 2. block标签内部可以有任意标签和变量,甚至可以在区块引入其他文件,如下
> `{block name="include"}{include file="Public:header" /}{/block}`
```
// 一个基础模板实例:base.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}标题{/block}</title>
</head>
<body>
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="right"}右边分栏{/block}
{block name="footer"}底部{/block}
</body>
</html>
// 子模板中继承示例
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首页</a>
<a href="/info/" >资讯</a>
<a href="/bbs/" >论坛</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
{$vo.content}
{/volist}
{/block}
{block name="right"}
最新资讯:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/volist}
{/block}
{block name="footer"}
{__block__}
@ThinkPHP 版权所有
{/block}
```
### 模板继承规则:
### 1.在子模板中使用extend标签来继承base模板,当前子模板中,只能定义基础模板中已经定义的区块而不能定义其他的模板内容,否则将会直接忽略。
### 2.在子模板中可以对基础模板的区块进行重载,如果没有重新定义,代表沿用基础模板的定义,可以多级继承,但是子模板中的区块必须都在基础模板中进行定义
### 3.如果子模板定义了一个空的区块,代表删除基础模板中对应name的区块
### 4.将基础模板内容与子模板定义内容合并
```
// 如下子模板中的{__block__}会自动替换为基础模板中footer区块定义的内容
{block name="footer"}
{__block__}@ThinkPHP 版权所有
{/block}
```
### 5.extend标签也可以像include一样加载其他模板
```
// 继承view/public/base.html
{extend name="Public:base" /}
// 完整路径引入
{extend name="./Template/Public/base.html" /}
```
- 运行环境需求
- tp5目录结构
- 命令行生成代码
- 路由
- 请求
- 获取请求信息
- 超全局变量获取
- 更改请求变量的值
- 判断是否为某种请求类型
- 伪装表单请求类型
- HTTP头部信息
- 伪静态
- 向请求对象中注入自定义的属性和方法
- 简单的传参可以使用参数绑定
- 依赖注入(将对象注入方法作为参数)
- 将请求的数据进行缓存
- 控制器
- 一个控制器代码示例
- 空控制器
- 资源控制器
- 模型
- 一个模型代码示例
- 模型的四种调用方法
- 控制器中调用模型添加数据
- 控制器中调用模型更新数据
- 控制器中调用模型删除数据
- 控制器中调用模型查询数据
- 模型中使用聚合函数
- 获取器
- 修改器
- 自动写入时间戳
- 只读字段
- 软删除
- 自动类型转换
- 数据自动完成
- 查询范围
- 数组方式访问和转换为数组
- json序列化
- 模型的事件
- 关联模型
- 一对一关联
- 一对多关联
- 远程一对多(跨表关联)
- 多对多关联
- 多态关联
- 关联预载入N+1次查询变2次
- 延迟预载入
- 关联统计
- 视图与模板
- 模板引擎配置
- 分配数据到模板
- 输出替换
- 模板中输出变量
- 模板中输出系统变量(配置常量超全局)
- 模板中输出请求信息
- 模板中使用php函数
- 输出到模板中的变量指定默认值
- 模板中进行运算
- 原样输出代码不解析
- 模版中注释
- 模板布局与继承
- 文件包含
- 内置标签
- 循环输出标签
- 比较标签
- 条件判断标签
- 引入资源文件(js-css)
- 使用原生php
- 在模板中定义变量和常量
- 助手函数
- 常用功能
- 表单验证
- 验证器的定义
- 自定义验证规则
- 速查表
- 系统默认根命名空间
- 系统路径常量
- 请求变量
- URL请求和信息方法