ThinkPHP(8):模板布局和模板继承

    科技2022-07-10  117

    模板布局

    全局配置

    比较适用于全站使用相同布局的情况(比如顶部和底部保持不变)

    1、需要在config目录下的template.php 文件中添加以下配置

    //开启全局模板布局 'layout_on' => true, //全局模板布局文件名 'layout_name' => 'layout',

    2、渲染模板

    Demo8.php

    <?php namespace app\index\controller; use think\Controller; class Demo8 extends Controller { public function test1() { return $this->view->fetch('test1'); } }

    模板test1.html

    <h2 style="color: blue">我是网站的内容区</h2>

    全局模板 layout.html

    {include file="header"} {__CONTENT__} {include file="footer"}

    header.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h2 style="color: red;">我是网站的顶部</h2>

    footer.html

    <h2 style="color: green;">我是网站的底部</h2> </body> </html>

    注:

    在不开启layout_on布局模板之前,会直接渲染 application/index/view/Demo8/test1.html 模板文件,开启之后,首先会渲染application/index/view/layout.html 模板,读取layout模板之后会再解析Demo8/test1.html 模板文件布局模板的写法和其他模板的写法类似,本身也可以支持所有的模板标签以及包含文件,区别在于有一个特定的输出替换变量 {__CONTENT__}layout.html、header.html、footer.html 都是之间放在application/index/view目录下

    模板标签(略)

    动态方法布局(略)

    模板布局文档

    模板继承

    准备:

    如果开启了全局模板布局,先将其关闭在view下创建public目录,来存放一些基本模板:base.html(必须的)、header.html(网站顶部)、footer.html(网站底部)。后两个可以没有,但是网站一般都有这两个部分(可以以其他名字命名)

    Demo8.php

    <?php namespace app\index\controller; use think\Controller; class Demo8 extends Controller { public function test2() { return $this->view->fetch('test2'); } }

    header.html 和 footer.html与上面相同

    base.html

    {include file="public/header" /} {block name="nov"} 导航 {/block} {block name="main"} 主题部分 {/block} {include file="public/footer" /}

    test2.html

    <! -- 继承基础模板 --> {extend name="public/base"} <!--声明区块--> {block name="main"} <h2>我是继承案例的内容</h2> {/block}

    注:

    每个区块由{block} {/block}标签组成,block标签含有一个name属性,用来区别不同的区块子模板中(test2.html)需要继承继承模板(base.html),使用extend标签,name属性指定模板的位置,这里根路径为view目录区块的作用可以说就是来占位置的,如果基础模板中的区块没有被声明,则会显示区块中的文字。如果目前不需要只需要占位,可以只声明区块,不添加内容,例如 {block name="nov"}{/block} 如果在子模板中想继承父模板中区块的内容可以使用 {block} 标签继承与类的继承很相似。可以理解为父模板中存在某个区块,子模板中不存在该区块,那就显示父模板中的区块;父模板和子模板中都存在相同区块,那就子模板区块代替父模板区块,显示子模板区块在区块外的标签内容不会被显示
    Processed: 0.017, SQL: 8