模板渲染:是控制器类在继承系统控制器基类( \think\Controller )后调用 fetch 方法
fetch 模板表达式:模块@控制器/操作方法 fetch('模板表达式',[模板变量数组],[模板配置数组])
模板默认根目录是:模块/view/控制器名/模板文件名
模板文件的后缀可自定义config/template.php,默认为html
模板参数我们一般不在控制器动态配置,而是在config/template.php中统一配置

视图文件:tp51/application/index/view/demo1~3.html
我的姓名是:<span style="color: red;font-size: 30px;">{$name}</span><br>
{$name}的年龄是:<span style="color: green;font-size: 30px;">{$age} 岁</span><br>
{$name}的工资是:<span style="color: blue;font-size: 30px;">{$salary} 元</span><?php
namespace app\index\controller;
use think\facade\View; //视图类静态代理:将内部方法全部看作静态进行调用
use think\Controller;
class Index extends Controller
{
public function index()
{
return '<h2 style="color:red;text-align:center">测试页面:测试成功</h2>';
}
}1. 使用视图方法:display()不通过模板,直接渲染内容,支持HTML标签
public function demo1()
{
// $name = '齐天大圣';
//直接输出变量
// return View::display('我的姓名是:<span style="color:red">'.$name.'</span>');
}2. 使用fetch(),加载指定模板文件输出
public function demo1()
{
//直接导入View门面类进行调用
// return View::fetch('demo1',['name'=>'孙悟空']);
// 控制器类中有一个属性view,保存着视图类的实例对象
// return $this->view->fetch('demo1',['name'=>'孙悟空']);
//控制类Controler.php中对常用视图方法做了简化
// return $this->fetch('demo1',['name'=>'孙悟空']);
}3. 框架也内置了一个助手函数提供大家使用view(),在任何情况下都可以使用助手函数,不依赖外部是否导入了某个类
public function demo1()
{
// 框架也内置了一个助手函数提供大家使用view()
return view('demo1',['name'=>'孙悟空','age'=>5000,'salary'=>10000]);
}
模板赋值
除了系统变量和配置参数输出无需赋值外,其他变量如果需要在模板中输出必须首先进行模板赋值操作,
否则会抛出异常,传递数据到模板输出有下面几种方式:
1. 使用assign()必须要调用View类,以后我们统一使用Controller来调用
public function demo2()
{
// $name = '猪八戒';
// $age = 8000;
// $salary = 5000;
$this->view->assign('name', '猪八戒');
$this->view->assign('age', 8000);
$this->view->assign('salary', 5000);
return $this->fetch('demo2');
}2. 传参方式: fetch()或view()
public function demo2()
{
return view('demo2',['name'=>'猪八戒','age'=>8000,'salary'=>5000]);
}3. 对象方式: 就是通过Controller中的二个魔术方法来实现视图类的数据注入的
public function demo2()
{
$this->view->name = '猪八戒';
$this->view->age = 8000;
$this->view->salary = 5000;
//如果是按默认规则创建的模板文件,则模板文件名可以省略
return $this->view->fetch();
}
模板过滤与替换
tp51也之前版本相比,直接删除了模板字符串替换功能,而改为模板配置参数来实现
config/template.php: 'tpl_replace_str' => [''=>''],
不过,建议大家在控制器使用filter()直接进行过滤替换,更简洁
public function demo3()
{
//将模板中的猪八戒 换成: 猪悟能
$this->view->assign('name', '猪八戒');
$this->view->assign('age', 8000);
$this->view->assign('salary', 5000);
return $this->filter(function($content) {
return str_replace('猪八戒', '猪悟能', $content);
})
->fetch();
//替换内容每次只能替换一个属性值
return $this->filter(function($content) {
return str_replace('8000', '5000', $content);
})
->fetch();
}
模板布局
一、全局配置,先开启模板布局功能
1. config/template.php
2.'layout_on' => true, 'layout_name' = 'layout', 'layout_item'=>'{__REP__}'

二、模板标签的方式
1. 不需要在config/template.php中开启和配置布局模板
2. 直接在需要使用布局模板的模板文件顶部指定布局模板文件即可: {layout name="布局模板名" /}
3. 关闭布局:{_ _NOLAYOUT_ _}

三、在控制器动态配置
1.不需要在模板配置文件做任何配置,也不需要在当前模板中添加任何标签
2.当然,布局模板,还是要事先制作好的
3.直接调用:$this->view-engine->layout(true)开启
控制器文件:tp51/application/index/controller/index.php
动态开启模板布局,一切使用默认的布局参数:layout_name=layout,{__CONTENT__}
public function demo4()
{
//动态开启模板布局,一切使用默认的布局参数:layout_name=layout,{__替换符__}
//$this->view->engine->layout(true);
$this->view->engine->layout('layout','{__REPLACE__}');
return $this->view->fetch();
简化链式调用 1
return $this->view //调用视图对象
->engine //模板引擎对象
->layout(true) //开启模板布局
->fetch('index/demo4'); //渲染模板
简化链式调用 2
return $this->view
->engine
->layout('layout','{__REPLACE__}')
->fetch('index/demo4');
//关闭模板布局
// return $this->view->engine->layout(false)->fetch('index/demo4');
}自定义模板布局参数,layout可以是任意的布局文件,被替换的内容标识符也可以自定义
头部文件:tp51/application/index/view/hebox/header.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style type="text/css">
.muin {
width: 100%;
height: 50px;
background:#E09600;
line-height: 50px;
}
.muin ul {
width: 800px;
margin: auto;
}
.muin ul li{
list-style: none;
float: left;
text-align: center;
margin-right: 50px;
}
.muin a{
text-decoration: none;
color: #fff;
font-size:18px;
font-weight: bold;
}
</style>
</head>
<body>
<div class="muin">
<ul>
<li><a href="">首页</a></li>
<li><a href="">日记</a></li>
<li><a href="">相册</a></li>
<li><a href="">说说</a></li>
<li><a href="">留言</a></li>
<li><a href="">应用</a></li>
<li><a href="">游戏</a></li>
<li><a href="">动态</a></li>
<li><a href="">资料</a></li>
</ul>
</div>
</body>
</html>点击 "运行实例" 按钮查看在线实例
底部文件:tp51/application/index/view/hebox/footer.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style type="text/css">
.footer{
width: 100%;
height: 80px;
background: #F8DB4F;
padding: 20px 0;
}
.link {
text-align: center;
}
.link a {
text-decoration: none;
color: #403e39;
margin: 10px 3px;
}
.link a:hover{
color: #cc8f14;
}
p {margin-top: 5px;}
</style>
</head>
<body>
<div class="footer">
<div class="link">
<a href="">空间手机版</a><span> | </span>
<a href=""> 黄钻贵族</a><span> | </span>
<a href="">官方Qzone</a><span> | </span>
<a href="">QQ互联</a><span> | </span>
<a href="">认证服务</a><span> | </span>
<a href="">腾讯博客</a><span> | </span>
<a href="">腾讯客服</a><span> | </span>
<a href="">QQ空间服务协议</a><span> | </span>
<a href="">Complaint Guidelines</a><span> | </span>
<a href="">粤网文[2017]6138-1456号</a>
<p>Copyright © 2005 - 2018 Tencent.<a href="">All Rights Reserved.</a></p>
<p>腾讯公司 <a href="">版权所有</a></p>
</div>
</div>
</body>
</html>点击 "运行实例" 按钮查看在线实例
布局文件:tp51/application/index/view/layout.html
{include file="hebox/header" /}
{__REPLACE__}
{include file="hebox/footer" /}
模板继承
一. 在view/base.html: 做为被其它模板继承的基础模板文件,也可以叫父模板
1. 基础模板中,应该只有block标签,而不应该有其它的标签;
2. 基础模板中,写在block标签之外内容,会原样输出到子模板中
二. base.html中,需要被子模板重写的内容全部用{block name=""}进行定义
{block name="beader"}
{include file="hebox/header" /}
{/block}三. 子模板中直接用{extend name="" /}继承即可
{extend name="base" /}清除基础模板中name区块的内容
{block name="name"}{/block}1.子模板中,只能对基础模板中的区块block进行重写;
2.子模板中不能写其它内容,否则会直接忽略掉;
4.子模块中未重写的区块内容,将原样显示
3.子模拟中的区块顺序无所谓;
4.如果子模块中的区块内容为空,则是清除区块中的原内容
基础文件(父模块):tp51/application/index/view/base.html
{block name="header"}
{include file="hebox/header" /}
{/block}
{block name="main"}主体部分{/block}
{block name="text"}新主体你们喜欢吗?{/block} <br>
{block name="footer"}
{include file="hebox/footer" /}
{/block}继承文件(子模块):tp51/application/index/view/demo5.html
{extend name="base" /}
{//修改头部}
{block name="header"}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
.muin {
width: 100%;
height: 50px;
background:#000;
line-height: 50px;
color:#fff;
text-align: center;
font-size: 20px;
font-weight: bold;
}
</style>
</head>
<body>
<div>我是导航条</div>
</body>
</html>
{/block}
{//更新主体部分}
{block name="main"}
<div style="height:300px;background: red;line-height: 300px;">
<h1 style="font-size: 50px;text-align: center;margin: 0;color:#fff;">我是新的主体部份</h1>
</div>
{/block}
{//继承父模块的内容 {__block__}}
{block name="text"}{__block__}<span style="font-size: 50px;text-align: center;margin: 0;color:red;">很喜欢!!</span>{/block}
{//清除底部}
{block name="footer"}{/block}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号