thinkphp5.0模板讲解(二)

6.使用函数默认值

//我们可以给变量输出提供默认值,例如:
{$user.nickname|default="这家伙很懒,什么也没留下"}

//对系统变量依然可以支持默认值输出,例如:
{$Think.get.name|default="名称为空"}

//默认值和函数可以同时使用,例如:
{$Think.get.name|getName|default="名称为空"}

7.使用运算符

我们可以对模板输出使用运算符,包括对“+”“-” “*” “/”和“%”的支持。
thinkphp5.0模板讲解(二)_第1张图片
在使用运算符的时候,不再支持常规函数用法,例如:

{$user.score+10} //正确的
{$user['score']+10} //正确的
{$user['score']*$user['level']} //正确的
{$user['score']|myFun*10} //错误的 |是常规用法 muFun()可以
{$user['score']+myFun($user['level'])} //正确的

8.三元运算符

// ?? 》 如果有设置$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 }

9.原样输出

可以使用literal标签来防止模板标签被解析

{literal}
    Hello,{$name}{/literal}

上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。
literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。
总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal标签处理。
需要注意的是配置‘view_replace_str’替换参数,会替换掉literal标签内的内容,可以配置‘template.tpl_replace_string’避免替换掉literal标签内的内容。

10.模板注释

模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。
格式:
注意{和注释标记之间不能有空格。

// 单行注释
{/* 注释内容 */ } 或 {// 注释内容 } 

// 多行注释
{/* 这是模板
注释内容*/ }

11.模板布局

第一种方式:全局配置方式

// 配置文件中配置
'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');
     }
}

三种模板布局方式中,第一种和第三种是在程序中配置实现模板布局,第二种方式则是单纯通过模板标签在模板中使用布局。具体选择什么方式,需要根据项目的实际情况来了

12.模板继承

{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=<span class="hljs-string">"title"</span>}标题{/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 版权所有

在当前子模板中,只能定义区块而不能定义其他的模板内容,否则将会直接忽略,并且只能定义基础模板中已经定义的区块。

13.包含文件

在当前模版文件中包含其他的模版文件使用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这样的死循环。

你可能感兴趣的:(PHP)