先试下出个页面 - 模板 ¶
作者:KK
发表日期:2016.12.8
更新日期:2018.8.6
补充了“使用 layout 时自定义各页面的标题”小节。
基本使用 ¶
Yii2默认是不用模板引擎的,模板目录则是views
目录
比如上一篇文章中叫你创建了test
控制器,则在这个views目录下也建一个test
目录,里面创建一个 index.php
,输入一些你想测试的显示内容
这样就部署好一个页面模板了,接下来要显示它,在test控制器的方法里执行
return $this->renderPartial('index');
就可以输出页面了
- 明白了吧,控制器ID叫test的话,
$this->renderPartial('index')
的时候就会自动去views目录根据控制器ID找到test目录,再找指定的index.php来输出
本质上不叫输出,而叫渲染,它返回个HTML字符串而已 ¶
把test方法的代码改成这样试试:
$content = $this->renderPartial('index');
file_put_contents('D:/a.html', $content); // 具体的文件路径自己拟定
return '输出内容';
访问后会看到“输出内容”,再打开D:/a.html,发现里面有HTML内容
因为$content就是这个HTML字符串,renderPartial
方法返回的就是根据index.php这个模板渲染后的一个字符串
所以概念上来说renderPartial不是输出模板,而是渲染模板,不过我们有时候交流方便直接说输出模板而已,这样其实大家都知道是把渲染结果return给框架
那其实echo $this->renderPartial('index');
也是可以输出页面的
注册变量 ¶
要传递一个叫做name和age的变量给模板,控制器要在renderPartial里传入第二个参数
,比如这样:
return $this->renderPartial('index', [
'name' => '小明', //注册name变量给模板,就是$name
'age' => '15', //你懂的
]);
那模板就可以直接调用输出了
echo $name;
echo $age;
Layout(模板布局) ¶
现在许多流程框架都有一个叫“模板布局“的概念,不管叫什么,反正它们通常都是要实现同一个普遍的网站需求:大部分页面都使用相同的页眉和页脚
在yii里是这样解决的,在views里有个layouts文件夹
,你在里面创建一个叫common.php
的文件(这就是模板布局文件),编写以下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>XXX网站"pageMainContent"><?php echo $content; ?></div>
<footer>页脚
然后将test方法改成这样:
public function actionTest(){
$this->layout = 'common';
return $this->render('index');
}
好了,刷新页面你会发现类似我这样的页面输出:
估计你也懂了,views/layouts/common.php
这个模板定义了各页面的页眉和页脚内容,通过echo $content
把中间部分输出就可以了,但这里要注意,需要用 render
方法才可以使用layout布局,如果你改成$this->renderPartial('index')
。
就会不使用layout的,比如特定的活动页面或别的页面不使用公共页眉页脚才用renderPartial
。
默认 layout 和指定 layout
但你可能会疑惑是不是每次render前都要设置
$this->layout
属性呢?其实不用的,这个layout属性的默认值是
main
,如果你不设置它,它就会以views/layouts/main.php
作为模板布局(官方已经放好这个文件了,你拿着改也可以),接下来你可以尝试着去掉$this->layout
的赋值,直接render,就会以自带的main这个layout作为布局进行渲染了。如果你想整个控制器所有action进行render的时候都统一用另一个layout的话可以重写父类的属性声明
public $layout = 'common';
这样来定义。而如果要整个站点都用另一个layout都可以,以后再说,因为涉及配置文件的知识。
使用 layout 时自定义各页面的标题 ¶
在上面的 layout 里写死了title叫“XXX网站”这是不行的,因为实际上每个页面的标题都会各不相同,一般我们应该这样做:
layout 的 title 如此输出:
<title><?php echo $this->title; ?> - 汽车论坛
在主内容模板里对
$this->title
进行赋值:echo $this->title = '主题列表';
然后就会输出“主题列表 - 汽车论坛”这样的标题了。