视图是MVC中的V层,而模板是将视图里要展现的数据进行解析编译的功能。TP框架内置了一个基于XML的模板引擎ThinkTemplate,使用动态编译和缓存技术,支持自定义标签库。
变量输出
在模板中输出变量是非常容易的,使用assign()方法,以键值对的方式传递变量和值。
//给模板传递一个变量
$user = '某某某';
$this->assign('user',$user);
在模板中可以这么调用:
{$user}
模板编译后的结果是:
<?php echo ($user);?> //可以在Runtime中查看
模板标签{和$之间不能有任何空格,否则无法解析。如果你想更换两个{}可以设置:
//修改默认标签
'TMP_L_DELIM'=>'<{',
'TMP_R_DELIM'=>'}>',
调用方式就需要变成:
<{$user}>
如果传递一个数组,我们直接传递过去后,通过两种方式调用:
//给模板传递一个数组
$data['user'] = '某某某';
$data['email'] = '[email protected]';
$this->assign('data',$data);
调用方式为:
User:{$data.user} Email:{$data.email}
或
User:{$data['user']} Email:{$data['email']}
如果传递一个对象,我们之间传递过去后,通过两种方式调用:
//给模板传递一个对象
$data = new\stdClass(); //创建空对象
$data->user = '某某某';
$data->email = '[email protected]';
$this->assign('data',$data);
调用方式为:
User:{$data->user} Email:{$data->email}
或
User:{$data:user} Email:{$data:email}
系统变量
在模板中,不但可以输出PHP的系统变量,还可以输出TP的系统变量
//输出PHP系统变量
{$Think.server.script_name} //$_SERVER['SCRIPT_NAME']
{$Think.session.admin} //$_SESSION['admin']
{$Think.get.user} //$_GET['user']
{$Think.post.user} //$_POST['user']
{$Think.request.user} //$_REQUEST['user']
{$Think.cookie.name} //$_COOKIE['name']
//Thinkphp的系统变量
{$Think.const.APP_PATH} //目录
{$Think.config.url_model} //URL模式
{$Think.lang.var_error} //语言变量
使用函数
有时侯我们需要在模板中使用PHP函数的话,可以按照下面的格式使用:
{$user|md5}
如果有多个参数要传递,可以参考如下设置:
{$date|date="Y-m-d H:i:s",###}
PS:表示date函数传入两个参数,每个参数用逗号分割,这里第一个参数是Y-m-d H:i:s,第二个参数是前面要输出的date变量,因为该变量是第二个参数,因此需要用###标识变量位置,编译后的结果是:
<?php echo (date('Y-m-d H:i:s'.$date));?>
前面输出变量,在后面定义,则不需要###
{$user|mb_substr = 0,3,'UTF-8'}
多个函数用“|”隔开即可
{$user|mb_substr=0,3,'UTF-8'|md5|sha1}
也可以用以下格式写法:
{:md5(mb_substr($user,0,3,'UTF-8'))}
使用运算符
我们可以在模板中使用运算符,包括
“+”、“-”、“*”、“/”、“%”、“–”、“++”等。
如:
{$data['num']+10} //中括号
{$data['num']+getNum()} //函数
模板还指出三元运算符
{$user ? '有值' : '无值'} //如果为true则输出有值,否则输出无值
包含文件
在一个系统中,可以包含通用的头文件和脚文件:header和footer。由于每个页面的头和脚都是相同的,所以需要独立分离出来,再用包含文件引入。
我们可以在View目录下default主题目录下创建一个public目录,这个目录专门存放公共调用模块文件。
<include file='Public/header'/>
<include file='Public/footer'/>
也可使用绝对路径模式
<include file='./thinkphp/Home/View/default/Public/header.html'>
模板注释
模板支持注释功能
{//这是注释}
{/*这也是注释*/}
{/*这是
多行注释*/}
模板继承
//基础模板需要子模板修改的部分可以用<block>包含,并且设置name值
<block name="main">主要内容</block>
//子模板只要按照同样的方法,修改<block>内部的值即可完成修改
<block name="main">修改了</block>
//创建Public下base.html模板基页
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset-utf-8">
</head>
<body>
<include file="Public/header"/>
<block name="main">主要内容</block>
<include file="Public/footer"/>
</body>
</html>
//使用<extend>导入模板基页,name为路径,和include导入方法一致
<extend name="Public/base"/>
<block name="main">修改了</block>
模板布局
TP框架的模板引擎内置了布局模板功能支持,可以方便实现模板布局以及布局嵌套功能,有三种布局方式:
1、全局配置方式
//开启模板布局功能,并指定基础页
'LAYOUT_ON'=>true,
'LAYOUT_NAME'=>'Public/layout', //假设已经在view下的Public文件夹下已经建立了layout.html文件
//基础页,{__CONTENT__}将被子页面的内容替换
<inlude file="Public/header"/>
<__CONTENT__>
<include file="Public/footer"/>
模板替换
在模板渲染之前,系统还回对读取的模板内容进行一些特殊字符串替换操作,也就实现了模板输出的替换和过滤(以下皆不含域名)
__ROOT__:会替换成当前网站地址(不含域名)
__APP__:会替换成当前应用的URL地址(不含域名)
__MODULE__:会替换成当前模块的URL地址(不含域名)
__CONTROLLER__:(或者__URL__兼容考虑):会替换成当前控制器的URL地址
__ACTION__:会替换成当前操作的URL地址
__SELF__:会替换成当前页面URL
__PUBLIC__:会替换成当前网站的公共目录,通常是根目录下的/Public/目录