视图模板
视图
视图功能由\think\View
类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think
模板引擎。
因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。
如果你的控制器继承了\think\Controller
类的话,则无需自己实例化视图类,可以直接调用控制器基础类封装的相关视图类的方法。
// 渲染模板输出
return $this->fetch('hello',['name'=>'thinkphp']);
下面的方法可以直接被调用:
方法 | 说明 |
---|---|
fetch | 渲染模板输出 |
display | 渲染内容输出 |
assign | 模板变量赋值 |
engine | 初始化模板引擎 |
如果需要调用View
类的其它方法,可以直接使用$this->view
对象:
助手函数
如果你只是需要渲染模板输出的话,可以使用系统提供的助手函数view
,可以完成相同的功能:
return view('hello',['name'=>'thinkphp']);
模板赋值
namespace index\app\controller;
class Index extends \think\Controller
{
public function index()
{
// 模板变量赋值
$this->assign('name','ThinkPHP');
$this->assign('email','thinkphp@qq.com');
// 或者批量赋值
$this->assign([
'name' => 'ThinkPHP',
'email' => 'thinkphp@qq.com'
]);
// 模板输出
return $this->fetch('index');
}
}
模板渲染
// 不带任何参数 自动定位当前操作的模板文件
return $this->fetch();
表示系统会按照默认规则自动定位模板文件,其规则是:
当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
// 指定模板输出 表示调用当前控制器下面的edit模板
return $this->fetch('edit');
表示调用Member控制器下面的read模板。
return $this->fetch('member/read');
跨模块渲染模板
return $this->fetch('admin@member/edit');
模板标签
要更改普通标签的起始标签和结束标签,可以更改下面的配置参数:
'template' => [
// 模板引擎
'type' => 'think',
//标签库标签开始标签
'taglib_begin' => '<',
//标签库标签结束标记
'taglib_end' => '>',
],
输出模板标签就需要改成
<eq name="name" value="value">
相等
<else/>
不相等
</eq>
变量输出
$view = new View();
$view->name = 'thinkphp';
return $view->fetch();
Hello,{$name}!
系统变量输出
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
请求参数
模板支持直接输出Request请求对象的方法参数,用法如下:
// 调用Request对象的get方法 传入参数为id
{$Request.get.id}
// 调用Request对象的param方法 传入参数为name
{$Request.param.name}
// 调用Request对象的param方法 传入参数为user.nickname
{$Request.param.user.nickname}
// 调用Request对象的root方法
{$Request.root}
// 调用Request对象的root方法,并且传入参数true
{$Request.root.true}
// 调用Request对象的path方法
{$Request.path}
// 调用Request对象的module方法
{$Request.module}
// 调用Request对象的controller方法
{$Request.controller}
// 调用Request对象的action方法
{$Request.action}
// 调用Request对象的ext方法
{$Request.ext}
// 调用Request对象的host方法
{$Request.host}
// 调用Request对象的ip方法
{$Request.ip}
// 调用Request对象的header方法
{$Request.header.accept-encoding}
使用函数
我们往往需要对模板输出变量使用函数,可以使用:
{$data.name|md5}
编译后的结果是:
<?php echo (md5($data['name'])); ?>
{$data.name|substr=0,3}
如果函数有多个参数需要调用,则使用:
{$create_time|date="y-m-d",###}
还可以支持多个函数过滤,多个函数之间用“|”分割即可,例如:
{$name|md5|strtoupper|substr=0,3}
使用默认值
给变量输出提供默认值,例如:
{$user.nickname|default="这家伙很懒,什么也没留下"}
系统变量依然可以支持默认值输出,例如:
{$Think.get.name|default="名称为空"}
默认值和函数可以同时使用,例如:
{$Think.get.name|getName|default="名称为空"}
三元运算
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
原样输出
可以使用literal标签来防止模板标签被解析,例如:
{literal}
Hello,{$name}!
{/literal}
模板注释
单行注释
{/* 注释内容 */ } 或 {// 注释内容 }
多行注释
{/* 这是模板
注释内容*/ }
模板布局
全局配置方式
'template' => [
'layout_on' => true,
'layout_name' => 'layout',
]
首先会渲染application/index/view/layout.html
模板,布局模板的写法和其他模板的写法类似,本身也可以支持所有的模板标签以及包含文件,区别在于有一个特定的输出替换变量{__CONTENT__}
,例如,下面是一个典型的layout.html
模板的写法:
{include file="public/header" /}
{__CONTENT__}
{include file="public/footer" /}
包含文件
在当前模版文件中包含其他的模版文件使用include标签,标签用法:
{include file='模版文件1,模版文件2,...' /}
使用模版表达式
{include file="public/header" /} // 包含头部模版header
{include file="public/menu" /} // 包含菜单模版menu
{include file="blue/public/menu" /} // 包含blue主题下面的menu模版
内置标签
标签名 | 作用 | 包含属性 |
---|---|---|
include | 包含外部模板文件(闭合) | file |
load | 导入资源文件(闭合 包括js css import别名) | file,href,type,value,basepath |
volist | 循环数组数据输出 | name,id,offset,length,key,mod |
foreach | 数组或对象遍历输出 | name,item,key |
for | For循环数据输出 | name,from,to,before,step |
switch | 分支判断输出 | name |
case | 分支判断输出(必须和switch配套使用) | value,break |
default | 默认情况输出(闭合 必须和switch配套使用) | 无 |
compare | 比较输出(包括eq neq lt gt egt elt heq nheq等别名) | name,value,type |
range | 范围判断输出(包括in notin between notbetween别名) | name,value,type |
present | 判断是否赋值 | name |
notpresent | 判断是否尚未赋值 | name |
empty | 判断数据是否为空 | name |
notempty | 判断数据是否不为空 | name |
defined | 判断常量是否定义 | name |
notdefined | 判断常量是否未定义 | name |
define | 常量定义(闭合) | name,value |
assign | 变量赋值(闭合) | name,value |
if | 条件判断输出 | condition |
elseif | 条件判断输出(闭合 必须和if标签配套使用) | condition |
else | 条件不成立输出(闭合 可用于其他标签) | 无 |
php | 使用php代码 | 无 |