thinkphp实现布局嵌套
thinkphp 使每个模板页都包含一个header文件和一个footer文件
由于在做的工程中,每个模板页都会包含同一个header和footer部分,如果我们每个文件中都写一遍的话,
那就大大造成了代码冗余,所以要避免重复代码的出现。
介绍几种方法来使得每个模板页都能包含~
全局配置方式
1.我们可以在Home目录的Conf文件中开启LAYOUT_ON 参数(默认不开启),并且设置布局入口文件名LAYOUT_NAME(默认为layout)
'LAYOUT' => true,
'LAYOUT_NAME' => 'layout',
2.在模板目录下建立一个layout.html文件,文件代码如下:
<include file="Public:header" />
{__CONTENT__}
<include file="Public:footer" />
{CONTENT} 为特定字替换符串,如果模板为Index/index.html,thinkphp先读取layout模板之后,会再解析index/index.html模板文件,并把解析后的内容替换到layout布局模板文件的{CONTENT}特定字符串
当然我们也可以自己修改替换部分的名称,但是只能有一个:
'TMPL_LAYOUT_ITEM' => '{__REPLACE__}' //通过设置来改变这个特定的替换字符串
也可以指定其他位置的布局模板,设置
'LAYOUT_NAME'=>'Layout/layoutname',
如果某些页面不需要使用这个功能,可以在模板文件开头加上 {__NOLAYOUT__}
。
模板标签方式
这种布局方式我们不需要设置LAYOUT_ON参数,不然会造成循环。直接在需要引入的模板头部定义标签即可:
<layout name="layout" />
表示的是当前模板文件需要使用layout.html布局模板文件。文件里面的定义方法跟第一种一样。
如果需要其他的布局模板,可以改变layout的name来实现。
<layout name="newlayout" />
使用layout控制模板布局
使用内置的layout方法可以更灵活的在程序中控制模板输出的布局功能,尤其适用于局部需要布局或者关闭布局的情况,这种方式也不需要在配置文件中开启LAYOUT_ON。例如:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
layout(true);//or layout(false); or layout("Layout/layoutname");
$this->display();
}
}