视图模板
视图功能由 \think\View
类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think模板引擎。
模板渲染
以下模板渲染的方法,除了助手函数,其他的都需要继承了
\think\Controller
类默认的视图目录是模块的view目录
<?php
namespace app\home\controller;
use think\Controller;
class Index extends Controller
{
// 定义属性
protected $BusinessModel = null;
// 控制器初始化
public function _initialize()
{
// 实例化模型
$this->BusinessModel = model('Business.Business');
}
// 查询数据
public function index()
{
/*
不带任何参数 自动定位当前操作的模板文件
表示系统会按照默认规则自动定位模板文件,其规则是:
当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
*/
return $this->fetch();
// 指定模板输出 表示调用当前控制器下面的edit模板
return $this->fetch('edit');
// 表示调用Member控制器下面的read模板。
return $this->fetch('member/read');
// 跨模块渲染模板
return $this->fetch('admin@member/edit');
// 助手函数
return view();
// 调用this->view对象 如果需要调用View类的其它方法,可以直接使用$this->view对象
return $this->view->fetch();
}
}
模板赋值
除了系统变量和配置参数输出无需赋值外,其他变量如果需要在模板中输出必须首先进行模板赋值操作
<?php
namespace app\home\controller;
use think\Controller;
class Index extends Controller
{
// 定义属性
protected $BusinessModel = null;
// 控制器初始化
public function _initialize()
{
// 实例化模型
$this->BusinessModel = model('Business.Business');
}
// 查询数据
public function index()
{
// 模板变量赋值
$this->assign('name','ThinkPHP');
$this->assign('email','thinkphp@qq.com');
// 或者批量赋值
$this->assign([
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com'
]);
// 在fetch这个方法里模板赋值
return $this->fetch('',[
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com'
]);
// 助手函数
return view('',[
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com'
]);
}
}
变量输出
在模板中输出在控制器赋值的变量或者系统变量
控制器代码
<?php
namespace app\home\controller;
use think\Controller;
class Index extends Controller
{
// 定义属性
protected $BusinessModel = null;
// 控制器初始化
public function _initialize()
{
// 实例化模型
$this->BusinessModel = model('Business.Business');
}
// 查询数据
public function index()
{
// 用户数据
$data = [
'name' => 'demo',
'email' => 'demo@qq.com'
];
// 多维数组
$UserData = [
[
'id' => 1,
'name' => 'demo',
'age' => 18,
'sex' => 1
],
[
'id' => 2,
'name' => 'admin',
'age' => 22,
'sex' => 2
],
[
'id' => 3,
'name' => 'test',
'age' => 28,
'sex' => 2
]
];
// 模板赋值
$this->assign([
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com',
'user' => $data,
'UserData' => $UserData
]);
// 模板渲染
return $this->fetch();
}
}
HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
</head>
<body>
<!--
输出$name
注意模板标签的{和$之间不能有任何的空格,否则标签无效
-->
{$name}
<!--
单行注释
-->
{// $email}
{/* $email */}
<!-- 多行注释 -->
{/*
这里内容不会在页面显示
第二行也是
*/}
<!-- 输出一维数组 -->
{$user.name}
{$user['name']}
<!-- 循环输出多维数组 -->
<table>
<tr>
<th>ID</th>
<th>名字</th>
<th>年龄</th>
<th>性别</th>
</tr>
<!-- foreach 标签 -->
{foreach $UserData as $item}
{/*
if 标签
{if (条件)}
条件成立时所执行的代码
{else /}
条件不成立时所执行的代码
{/if}
*/}
<!-- 只输出年龄大于18的数据 -->
{if($item['age'] > 18)}
<tr>
<td>{$item['id']}</td>
<td>{$item['name']}</td>
<td>{$item['age']}</td>
<!-- 三元运算符 -->
<td>{$item['sex'] == 1 ? '男' : '女'}</td>
</tr>
{/if}
{/foreach}
</table>
</body>
</html>
系统变量输出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
</head>
<body>
<!-- 输出$_SERVER['SCRIPT_NAME']变量 -->
{$Think.server.script_name}
<!-- 输出$_SESSION['user_id']变量 -->
{$Think.session.user_id}
<!-- 输出$_GET['pageNumber']变量 -->
{$Think.get.pageNumber}
<!-- 输出$_COOKIE['name']变量 -->
{$Think.cookie.name}
</body>
</html>
常量输出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
</head>
<body>
<!-- 第一种写法 -->
{$Think.const.APP_PATH}
<!-- 第二种写法 -->
{$Think.APP_PATH}
</body>
</html>
配置输出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
</head>
<body>
{$Think.config.default_module}
{$Think.config.default_controller}
</body>
</html>
使用函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
</head>
<body>
<!-- 使用md5函数 -->
{$data.name|md5}
<!--
函数有多个参数需要调用
date函数传入两个参数,每个参数用逗号分割,这里第一个参数是y-m-d,第二个参数是前面要输出的create_time变量,因为该变量是第二个参数,因此需要用###标识变量位置
-->
{$create_time|date="y-m-d",###}
<!-- 如果觉得这样写起来比较麻烦,也可以直接这样写 -->
{:date('Y-m-d',1685723898)}
</body>
</html>
模板布局
全局配置方式
application\config.php
模块配置方式
application\home\config.php
<?php
return [
...
// 模板设置
'template' => [
// 开启模板布局
'layout_on' => true,
// 布局文件名称
'layout_name' => 'layout',
]
...
]
首先会渲染 application/home/view/layout.html
模板,布局模板的写法和其他模板的写法类似,本身也可以支持所有的模板标签以及包含文件,区别在于有一个特定的输出替换变量 {__CONTENT__}
,例如,下面是一个典型的
layout.html
模板的写法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>layout</title>
</head>
<body>
<!-- 引入公共头部 -->
{include file='common/header' /}
<!-- 输出替换变量 -->
{__CONTENT__}
<!-- 引入公共底部 -->
{include file='common/footer' /}
</body>
</html>