//我们可以给变量输出提供默认值,例如:
{$user.nickname|default="这家伙很懒,什么也没留下"}
//对系统变量依然可以支持默认值输出,例如:
{$Think.get.name|default="名称为空"}
//默认值和函数可以同时使用,例如:
{$Think.get.name|getName|default="名称为空"}
我们可以对模板输出使用运算符,包括对“+”“-” “*” “/”和“%”的支持。
在使用运算符的时候,不再支持常规函数用法,例如:
{$user.score+10} //正确的
{$user['score']+10} //正确的
{$user['score']*$user['level']} //正确的
{$user['score']|myFun*10} //错误的 |是常规用法 muFun()可以
{$user['score']+myFun($user['level'])} //正确的
// ?? 》 如果有设置$varname则输出$varname,否则输出'xxx'
{$varname.aa ?? 'xxx'}
echo isset($varname['aa']) ? $varname['aa'] : '默认值'; ?>
// ?= 》 表示$varname为真时才输出xxx
{$varname?='xxx'}
if(!empty($name)) echo 'xxx'; ?>
// ?:》 如果$varname为真则输出$varname,否则输出no
{$varname ?: 'no'}
echo $varname ? $varname : 'no'; ?>
// ? 表达式为真输出yes,否则输出no, 条件可以是==、===、!=、!==、>=、<=
{$a==$b ? 'yes' : 'no'}
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
可以使用literal标签来防止模板标签被解析
{literal}
Hello,{$name}!
{/literal}
上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。
literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。
总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal标签处理。
需要注意的是配置‘view_replace_str’替换参数,会替换掉literal标签内的内容,可以配置‘template.tpl_replace_string’避免替换掉literal标签内的内容。
模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。
格式:
注意{和注释标记之间不能有空格。
// 单行注释
{/* 注释内容 */ } 或 {// 注释内容 }
// 多行注释
{/* 这是模板
注释内容*/ }
第一种方式:全局配置方式
// 配置文件中配置
'template' => [
'layout_on' => true,
'layout_name' => 'layout',
]
// layout.html
{include file="public/header" /}
{__CONTENT__}
{include file="public/footer" /}
读取layout模板之后,会再解析user/add.html 模板文件,并把解析后的内容替换到layout布局模板文件的{CONTENT} 特定字符串。
//当然可以通过设置来改变这个特定的替换字符串,例如:
'template' => [
'layout_on' => true,
'layout_name' => 'layout',
'layout_item' => '{__REPLACE__}' //一个布局模板同时只能有一个特定替换字符串。
]
如果某些页面不需要使用布局模板功能,可以在模板文件开头加上 {NOLAYOUT} 字符串。
第二种方式:模板标签方式
//不需要在配置文件中设置任何参数,也不需要开启layout_on,直接在模板文件中指定布局模板即可,相关的布局模板调整也在模板中进行。
{layout name="layout" /}
//在layout标签里面指定要替换的特定字符串:
{layout name="Layout/newlayout" replace="[__REPLACE__]" /}
方法一的’layout_on’ => true,或者false切换的时候,如何页面没有变动,不会重新缓存,所以配置改不改不会生效**
此外 在head中 注释不生效 依旧会执行
第三种方式:使用layout控制模板布局
使用内置的layout方法可以更灵活的在程序中控制模板输出的布局功能,尤其适用于局部需要布局或者关闭布局的情况,这种方式也不需要在配置文件中开启layout_on。例如:
namespace app\index\controller;
use think\Controller;
class User extends Controller
{
public function add()
{
$this->view->engine->layout(true); // 表示当前的模板输出启用了布局模板,并且采用默认的layout布局模板。
//$this->view->engine->layout('Layout/newlayout');当前输出需要使用不同的布局模板,可以动态的指定布局模板名称
// 临时关闭当前模板的布局功能 ---使用layout方法动态关闭当前模板的布局功能(这种用法可以配合第一种布局方式,例如全局配置已经开启了布局,可以在某个页面单独关闭)
//$this->view->engine->layout(false);
return $this->fetch('add');
}
}
三种模板布局方式中,第一种和第三种是在程序中配置实现模板布局,第二种方式则是单纯通过模板标签在模板中使用布局。具体选择什么方式,需要根据项目的实际情况来了
{block name="title"}网站标题 {/block}
{block name="include"}{include file="Public:header" /}{/block}
//这是一个base.html
http-equiv="Content-Type" content="text/html; charset=utf-8">
{block name="title"}标题{/block}
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="right"}右边分栏{/block}
{block name="footer"}底部{/block}
//然后我们在子模板(其实是当前操作的入口模板)中使用继承:
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
"/" >首页
"/info/" >资讯
"/bbs/" >论坛
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
"/new/{$vo.id}">{$vo.title}
{$vo.content}
{/volist}
{/block}
{block name="right"}
最新资讯:
{volist name="news" id="new"}
"/new/{$new.id}">{$new.title}
{/volist}
{/block}
{block name="footer"}
{__block__}
@ThinkPHP 版权所有
{/block}
//上例中,我们可以看到在子模板中使用了extend标签来继承了base模板。在子模板中,可以对基础模板中的区块进行重载定义,如果没有重新定义的话,则表示沿用基础模板中的区块定义,如果定义了一个空的区块,则表示删除基础模板中的该区块内容。 上面的例子,我们就把left区块的内容删除了,其他的区块都进行了重载。而
{block name="footer"}
{__block__}@ThinkPHP 版权所有
{/block}
//这一区块中有{_block_}这个标签,当区块中有这个标记时,就不只是直接重载这个区块,它表示引用所继承模板对应区块的内容到这个位置,最终这个区块是合并后的内容。所以这里footer区块最后的内容是: 底部@ThinkPHP 版权所有
在当前子模板中,只能定义区块而不能定义其他的模板内容,否则将会直接忽略,并且只能定义基础模板中已经定义的区块。
在当前模版文件中包含其他的模版文件使用include标签
{include file='模版文件1,模版文件2,...' /}
包含的模板文件中不能再使用模板布局或者模板继承。
{include file="public/header" /} // 包含头部模版header
{include file="public/menu" /} // 包含菜单模版menu
{include file="blue/public/menu" /} // 包含blue主题下面的menu模版
//可以一次包含多个模版,例如:
{include file="public/header,public/menu" /}
//无论你使用什么方式包含外部模板,Include标签支持在包含文件的同时传入参数
{include file="Public/header" title="$title" keywords="开源WEB开发框架" /}
//就可以在包含的header.html文件里面使用title和keywords变量,如下:
"http://www.w3.org/1999/xhtml">
[title]
"keywords" content="[keywords]" />
包含文件中可以再使用include标签包含别的文件,但注意不要形成A包含A,或者A包含B而B又包含A这样的死循环。