ThinkPHP5.0模板之模板继承和包含文件与模板之内置标签

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41665015/article/details/80146441

模板继承是一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层。模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。

因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。

每个区块由{block} {/block}标签组成。 下面就是基础模板中的一个典型的区块设计(用于设计网站标题):

 
 
  1. {block name="title"}<title>网站标题</title>{/block}

block标签必须指定name属性来标识当前区块的名称,这个标识在当前模板中应该是唯一的(也就是说不能有重复的name属性的值),block标签中可以包含任何模板内容,包括其他标签和变量。

  1. {block name="title"}<title>{$web_title}</title>{/block}

    你甚至还可以在区块中加载外部文件:

     
       
    1. {block name="include"}{include file="Public:header" /}{/block}

一个模板中可以定义任意多个名称标识不重复的区块,如我们在view视图目录下定义一个base.html基础模板:



在子模板中,可以对基础模板中的区块进行重载定义,如果没有重新定义的话,则表示沿用基础模板中的区块定义,如果定义了一个空的区块,则表示删除基础模板中的该区块内容。

{___block__}这个标签,当区块中有这个标记时,就不只是直接重载这个区块,它表示引用所继承模板对应区块的内容到这个位置,最终这个区块是合并后的内容。

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

模板可以多级继承,比如B继承了A,而C又继承了B,最终C中的区块会覆盖B和A中的同名区块,但C和B中的区块必须是A中已定义过的。

子模板中的区块定义顺序是随意的,模板继承的用法关键在于基础模板如何布局和设计规划了,如果结合原来的布局功能,则会更加灵活。

(子模版区域外面的信息不会被展现出来的)


包含文件

在当前模版文件中包含其他的模版文件使用include标签,标签用法:

 
 
  1. {include file='模版文件1,模版文件2,...' /}

包含的模板文件中不能再使用模板布局或者模板继承。

路径以 项目目录/public/ 路径下为起点

可以直接包含一个模版文件名(包含完整路径),例如:

 
  
  1. {include file="../application/index/view/index/lang.html" /}




项目组常用内置标签

循环输出标签

VOLIST标签

volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出。 在控制器中首先对模版赋值:

  1. $list = User::all();
  2. $this->assign('list',$list);

在模版定义如下,循环输出用户的编号和姓名:

 
  
  1. {volist name="list" id="vo"}
  2. {$vo.id}:{$vo.name}<br/>
  3. {/volist}

Volist标签的name属性表示模板赋值的变量名称(就是assign分配过来的这个名字),因此不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突,例如:

然后在view视图目录下的user控制器里建一个list.html模板

支持输出查询结果中的部分数据,例如输出其中的第5~15条记录

  1. volist name="list" id="vo" offset="5" length='10'}//表示从第5条开始查询,查询10条
  2. {$vo.name}
  3. {/volist}

FOREACH标签

foreach标签类似与volist标签,只是更加简单,没有太多额外的属性,最简单的用法是:

  1. {foreach $list as $vo}
  2. {$vo.id}:{$vo.name}
  3. {/foreach}

FOR标签

用法:

 
  
  1. {for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" }
  2. {/for}

开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。comparison 的默认值是lt,name的默认值是i,步进值的默认值是1,举例如下:

 
  
  1. {for start="1" end="100"}
  2. {$i}
  3. {/for}

解析后的代码是

 
  
  1. for ($i=1;$i<100;$i+=1){
  2. echo $i;
  3. }


标签嵌套

模板引擎支持标签的多层嵌套功能,可以对标签库的标签指定可以嵌套。

系统内置的标签中,volist、switch、if、elseif、else、foreach、compare(包括所有的比较标签)、(not)present、(not)empty、(not)defined等标签都可以嵌套使用。例如:

 
  
  1. {volist name="list" id="vo"}
  2. {volist name="vo['sub']" id="sub"}
  3. {$sub.name}
  4. {/volist}
  5. {/volist}

上面的标签可以用于输出双重循环。

原生PHP

Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP语句代码 ,包括下面两种方式

使用php标签

例如:

 
  
  1. {php}echo 'Hello,world!';{/php}

我们建议需要使用PHP代码的时候尽量采用php标签,因为原生的PHP语法可能会被配置禁用而导致解析错误。

所有要查看效果的地址都是localhost/tp5/index/user/list

下面举一个原生的例子


注意:php标签或者php代码里面就不能再使用标签(包括普通标签和XML标签)了,因此下面的几种方式都是无效的:

 
  
  1. {php}{eq name='name'value='value'}value{/eq}{/php}

Php标签里面使用了eq标签,因此无效

 
  
  1. {php}if( {$user} != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}

Php标签里面使用了{$user}普通标签输出变量 ,因此无效。

 
  
  1. {php}if( $user.name != 'ThinkPHP' ) echo 'ThinkPHP' ;{/php}


(这样文件将会报错)

Php标签里面使用了$user.name 点语法变量输出 ,因此无效。

简而言之,在PHP标签里面不能再使用PHP本身不支持的代码。

如果设置了tpl_deny_php参数为true,就不能在模板中使用原生的PHP代码,但是仍然支持PHP标签输出。

时间:2018.4.30



猜你喜欢

转载自blog.csdn.net/qq_41665015/article/details/80146441
今日推荐